【问题标题】:Android SQLite Cursor returning only one entry when trying to read all entries尝试读取所有条目时,Android SQLite 光标仅返回一个条目
【发布时间】:2017-01-19 03:44:16
【问题描述】:

我正在尝试从 SQLite 数据库表中读取所有条目。问题是光标每次只返回一个条目。我知道该表已经有大约 30 个条目,因为当我再次尝试保存条目时,每个条目都会出现此错误:

android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: list.id (code 1555)                                                                    
#################################################################
Error Code : 1555 (SQLITE_CONSTRAINT_PRIMARYKEY)
Caused By : Abort due to constraint violation.
(UNIQUE constraint failed: list.id (code 1555))
#################################################################

我在这里看到了几个关于类似问题的问题,但没有一个解决方案适合我。到目前为止,这是我尝试过的:

public class Table
{
    private static final String TABLE_NAME = "list";

    // Column names
    private static final String ID = "id";
    private static final String INDEX = "index";
    private static final String TITLE = "title";


    private static final String CREATE_STATEMENT = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME +
            "(" + ID + " INTEGER PRIMARY KEY, " + TITLE + " TEXT, " + 
              INDEX + " INTEGER)";

    public static void create(SQLiteDatabase db)
    {
        db.execSQL(CREATE_STATEMENT);
    }

    public static void drop(SQLiteDatabase db)
    {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
    }

    public static void saveList(SQLiteDatabase db, ArrayList<MyObject> list)
    {
        for (MyObject obj : list)
        {
            long id = insert(db, obj);
        }
    }

    private static long insert(SQLiteDatabase db, MyObject obj)
    {
        final ContentValues values = new ContentValues();
        values.put(ID, obj.getId());
        values.put(INDEX, obj.getIndex());
        values.put(TITLE, obj.getTitle());
        return db.insert(TABLE_NAME, null, values);
    }

    public static ArrayList<MyObject> loadList(SQLiteDatabase db)
    {
        final ArrayList<MyObject> list = new ArrayList<>();
        Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_NAME, null);
        Log.d(TABLE_NAME, "Cursor size: " + cursor.getCount());
        if (cursor.moveToFirst())
        {
            do
            {
                final long id = cursor.getLong(cursor.getColumnIndexOrThrow(ID));
                final String title = cursor.getString(cursor.getColumnIndexOrThrow(TITLE));
                final int index = cursor.getInt(cursor.getColumnIndexOrThrow(INDEX));
                list.add(new MyObject(id, index, title);
            }
            while (cursor.moveToNext());
        }
        cursor.close();
        return list;
    }
}

我也尝试过使用cursor = db.query(TABLE_NAME, null, null, ..., null),但得到了相同的结果。

这就是我在SQLiteOpenHelper 类中调用上述函数的方式:

public void saveList(ArrayList<MyObj> list)
{
    final SQLiteDatabase db = getWritableDatabase();
    Table.drop(db);
    Table.create(db);
    Table.saveList(db, list);
}

public ArrayList<MyObject> loadList()
{
    return Table.loadList(getReadableDatabase());
}

我在同一个数据库中有另一个表,它的代码非常相似,但工作得很好。我一直在尝试解决这个问题一段时间,但我看不出会发生什么。任何帮助将不胜感激

【问题讨论】:

  • cursor.getCount() 记录了什么?
  • @GuruprasadRao 它返回 1 但我知道表中还有更多
  • 向表中插入数据时,每行的 ID 值是多少?
  • 确保你的数据库确实有一些价值。使用 SQLiteBrowser 或任何其他 IDE 来查看您的表。
  • 他的日志问题被用作该行已经存在的证据。当您尝试插入具有相同 ID 的两个元素时,这是正常的预期行为。是的,上面的查询显示表中只有一行,但他不相信这是真的,所以 count(*) 查询只是证实了这一点。一旦我们确认数据库中只有一行,我们可以看看为什么插入不起作用。这可能是重复键的问题,但问题的措辞方式,它并没有让我相信

标签: android sqlite android-cursor


【解决方案1】:

你的问题

obj.getId()

private static long insert(SQLiteDatabase db, MyObject obj)
{
    final ContentValues values = new ContentValues();
    values.put(ID, obj.getId()); // check whether you are updating this with different value or not
    values.put(INDEX, obj.getIndex());
    values.put(TITLE, obj.getTitle());
    return db.insert(TABLE_NAME, null, values);
}

【讨论】:

  • 我正在使用new Random(System.currentTimeMillis()).nextLong() 生成 ID,但不知何故,所有 31 个条目的 ID 都是相同的。刚刚根据您的 cmets 和答案意识到这一点。谢谢
  • 您的 logcat 正在显示约束问题,而您没有注意到
  • 我认为这是因为之前插入的条目已经存在,而不是不同的条目具有相同的 ID
  • 是的,我认为您对 sql 查询和约束不太熟悉:D
  • (SQLITE_CONSTRAINT_PRIMARYKEY)...此键不允许您将新数据插入表中
【解决方案2】:

我曾经遇到过同样的问题,尝试在表中添加一个 id 字段(_id INTEGER PRIMARY KEY AUTOINCREMENT),一旦我添加了该字段,我就可以根据需要检索更多行

【讨论】:

  • 在_ID列添加AUTOINCREMENT解决问题
猜你喜欢
  • 2011-11-27
  • 2015-09-21
  • 2017-02-18
  • 2022-01-06
  • 1970-01-01
  • 2016-12-06
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
相关资源
最近更新 更多