Sqlite插入行bug

时间:2016-09-21 20:39:34

标签: android android-sqlite sqldelight

我陷入了一个非常奇怪的错误。我有一个表跟随者,当我插入数据时,除了我第一次进入之外它是有效的。

第一次调用该函数时,没有抛出任何东西,插入函数按预期返回1.但是当我调用select all函数时,表是空的。

然而,当我在另一个时间用不同的参数调用该函数时,数据实际上是插入的,表格显示了一个条目(这一个)但是2作为id。

我正在使用Sqldelight。

public long insertFollower(String name, String wca_id, long created_at) {

    try {
        SQLiteDatabase db = openDatabase();

        return db.insert(Follower.TABLE_NAME, null, Follower.FACTORY.marshal()
                .name(name)
                .wca_id(wca_id)
                .created_at(created_at)
                .asContentValues());
    }

    catch (Exception e) {
        e.printStackTrace();
    }

    finally {
        closeDatabase();
    }

    return 0;
}

private static AtomicInteger openCount = new AtomicInteger();
private static SQLiteDatabase database;

public static final String DATABASE_NAME = "database.db";
public static final int DATABASE_VERSION = 12;

private static DatabaseHelper instance;

public static synchronized DatabaseHelper getInstance(Context context) {
    if(instance == null) {
        instance = new DatabaseHelper(context);
    }

    return instance;
}

public synchronized SQLiteDatabase openDatabase() {
    if(openCount.incrementAndGet() == 1) {
        database = getWritableDatabase();
    }

    return database;
}

public synchronized void closeDatabase() {
    if(openCount.decrementAndGet() == 0) {
        database.close();
    }
}


@Override
public void onCreate(SQLiteDatabase db) {

    db.execSQL(Follower.CREATE_TABLE);
    db.execSQL(Record.CREATE_TABLE);

}

由sqldelight生成的Follower.CREATE_TABLE

  String CREATE_TABLE = ""
  + "CREATE TABLE follower (\r\n"
  + "    _id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,\r\n"
  + "    name TEXT NOT NULL,\r\n"
  + "    wca_id TEXT NOT NULL\r\n"
  + ")";

编辑:

我注意到一些可能有帮助的奇怪的事情:

仅当表格为空时才有效

我插入一个无效的追随者。但是当我插入一个与第一个ID相同的其他跟随者时(有一个主键自动增量)。我得到一个UNIQUE异常,但表仍然是空的。

不要犹豫,询问更多信息。

谢谢。

1 个答案:

答案 0 :(得分:0)

我终于找到了答案,感谢@anstrong:选择我使用cursor.moveToFirst()的关注者,而while(cursor.moveToNext())就在

之后被调用