Ошибка вставки строк Sqlite
Я застрял на действительно странной ошибке. У меня есть таблица последователей, и когда я вставляю данные, она работает, за исключением первой записи.
При первом вызове функции ничего не выдается, и функция вставки возвращает ожидаемый результат 1. Но когда я вызываю функцию select all, таблица пуста.
Однако, когда я вызываю функцию в другой раз с другими параметрами, данные действительно вставляются, и таблица показывает одну запись (эту), но с 2 в качестве идентификатора.
Я использую 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);
}
И Follower.CREATE_TABLE, который был сгенерирован sqldelight
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"
+ ")";
РЕДАКТИРОВАТЬ:
Я заметил нечто странное, что может помочь:
Это работает, только если таблица пуста
Я вставляю подписчика, это не работает. Но когда я вставляю другого подписчика с тем же идентификатором, что и у первого (есть автоинкремент первичного ключа). Я получаю УНИКАЛЬНОЕ исключение, но таблица все еще пуста.
Не стесняйтесь спрашивать больше информации.
Спасибо.
1 ответ
Я наконец-то нашел ответ благодаря @anstrong: чтобы выбрать подписчика, которого я использовал cursor.moveToFirst()
и while(cursor.moveToNext())
был вызван сразу после