我在使用该事务添加到我的sqlite数据库时遇到问题。我将要添加大约1700行,并且这样做很长时间:
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;
}
所以我试图将这个方法重新编写成这样的事务:
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;
}
由于没有添加作为我的主键的COLUMN_ID,因此我收到错误。有关如何使此交易有效的任何建议?
编辑:::
这是我的for循环,它从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);
}
我应该在循环正确的范围内进行此交易吗?我没有别的办法。
答案 0 :(得分:2)
希望你用这样的sql字符串创建你的表:
create table MySQLiteHelper.TABLE_SITES(_id integer primary key autoincrement, ...
然后您应该能够通过为第一个参数发送null来插入并获取自动递增ID:
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);
另请注意,您正在绑定5个值,这是正确的(但在您有6个值且只有5个值之前)并且它们是从1开始的,而不是从0开始,这也是正确的。