从Parsed XML Android批量插入SQLite - 切换到事务

时间:2013-10-27 05:04:16

标签: android sqlite

我在使用该事务添加到我的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);

                }

我应该在循环正确的范围内进行此交易吗?我没有别的办法。

1 个答案:

答案 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开始,这也是正确的。