【问题标题】:Sqlite insert lines bugSqlite 插入行错误
【发布时间】:2016-09-21 20:39:34
【问题描述】:

我遇到了一个非常奇怪的错误。我有一个表追随者,当我插入数据时,除了我的第一个条目外,它可以工作。

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

但是,当我再次使用不同的参数调用该函数时,数据确实被插入,并且表格显示了一个条目(这个条目),但 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 异常,但表仍然是空的。

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

谢谢。

【问题讨论】:

  • 你能用SQLiteDebugger之类的工具来验证表是否为空(而不是你的编码选择语句)
  • 嗨,Al Lelopath,感谢您的快速回答。我想我将无法使用 SqliteDebugger,因为我的手机没有 root 并且我的计算机无法模拟手机。 ://
  • 参数重要吗?例如。如果你切换第一个和第二个插入的参数,你仍然得到同样的错误吗?第三个插入呢,它有什么作用?可能是第二个插入覆盖了第一个。
  • 参数不变。如果你切换,第一行将不会被写入。如果您第一次使用相同的参数调用两次。这两行不会写。如果你第三次调用,结果与第二次相同,只要它没有与第一行相同的参数,就会写入该行。我知道这是一个非常奇怪的错误。我使用了 Android 调试器,一切似乎都很好。
  • 我不清楚,在问题中你说“不同的参数”,在你的评论中你说参数没有改变。是哪个?

标签: android android-sqlite sqldelight


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    相关资源
    最近更新 更多