0

我无法通过事务添加到我的 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);

                }

我应该在那个for循环中做这个交易对吗?我看没有别的办法。

4

1 回答 1

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

于 2013-10-27T06:46:23.627 回答