Reputation: 1944
I am having trouble adding to my sqlite db with the transaction. I have about 1700 rows I'll be adding and it is taking WAY to long doing it this way:
public SnoTelSiteData createSnoTelSiteData(String markerID,
String sitename, String sitedesc, String lat, String lon) {
ContentValues values = new ContentValues();
values.put(MySQLiteHelper.COLUMN_SITEMARKERID, markerID);
values.put(MySQLiteHelper.COLUMN_SITENAME, sitename);
values.put(MySQLiteHelper.COLUMN_SITEDES, sitedesc);
values.put(MySQLiteHelper.COLUMN_SITELAT, lat);
values.put(MySQLiteHelper.COLUMN_SITELON, lon);
long insertId = database.insert(MySQLiteHelper.TABLE_SITES, null,
values);
Cursor cursor = database.query(MySQLiteHelper.TABLE_SITES, allColumns,
MySQLiteHelper.COLUMN_ID + " = " + insertId, null, null, null,
null);
cursor.moveToFirst();
SnoTelSiteData newSite = cursorToSnoTelSiteData(cursor);
cursor.close();
return newSite;
}
So I am trying to rework this method into a transaction like so:
public SnoTelSiteData bulkCreateSnoTelSiteData(String markerID,
String sitename, String sitedesc, String lat, String lon) {
String sql = "INSERT INTO " + MySQLiteHelper.TABLE_SITES
+ " VALUES (?,?,?,?,?,?);";
SQLiteStatement statement = database.compileStatement(sql);
database.beginTransaction();
statement.clearBindings();
statement.bindString(1, markerID);
statement.bindString(2, sitename);
statement.bindString(3, sitedesc);
statement.bindString(4, lat);
statement.bindString(5, lon);
statement.execute();
Log.w("EXECUTE", "Done");
database.setTransactionSuccessful();
database.endTransaction();
return null;
}
That isn't working since i get an error due to it not adding the COLUMN_ID which is my primary key. Any suggestions on how to make this transaction work?
EDIT:::
Here is my for loop that takes the info out of a SparseArray
for (int i = 0; i < vsize; i++) {
MapMarkers marks = new MapMarkers();
String title = visibleMarkers.valueAt(i).getTitle();
String desc = visibleMarkers.valueAt(i).getDesc();
Float latitude = visibleMarkers.valueAt(i).getLat();
Float longitude = visibleMarkers.valueAt(i).getLon();
String lat = latitude.toString();
String lon = longitude.toString();
m = map.addMarker(new MarkerOptions()
.position(new LatLng(latitude, longitude))
.title(title).icon(icon));
datasource.bulkCreateSnoTelSiteData(m.getId(), title, desc,
lat, lon);
marks.setTitle(title);
marks.setDesc(desc);
// markerInfo.put(m, marks);
m.setData(marks);
}
I should do this transaction within that for loop correct? I see no other way.
Upvotes: 0
Views: 372
Reputation: 11083
hopefully you created your table with a sql string like this:
create table MySQLiteHelper.TABLE_SITES(_id integer primary key autoincrement, ...
Then you should be able to insert and get your auto-incrementing id by sending a null for the first parameter like this:
String sql = "INSERT INTO " + MySQLiteHelper.TABLE_SITES
+ " VALUES (NULL,?,?,?,?,?);";
SQLiteStatement statement = database.compileStatement(sql);
database.beginTransaction();
statement.clearBindings();
statement.bindString(1, markerID);
statement.bindString(2, sitename);
statement.bindString(3, sitedesc);
statement.bindString(4, lat);
statement.bindString(5, lon);
Also note that you are binding 5 values, which is correct (but before you had 6 ?'s and only 5 values) and they are 1-based, not 0-based, which is also correct.
Upvotes: 2