【问题标题】:get specific row in SQLiteDatabase not working获取 SQLiteDatabase 中的特定行不起作用
【发布时间】:2016-08-03 12:41:29
【问题描述】:

我是 SQLiteDatabaseand 的新开发人员和菜鸟,遇到了这个小问题 .. 我需要一点帮助 我正在创建一个具有类别的简单 to_do 应用程序, 该应用程序可以创建类别并在列表视图中显示它们,通过单击刚刚创建的类别项目,我可以添加新的 to_do 任务并使用此类别名称在新的列表视图中显示它们

这是我的数据库:

public class DatabaseOpenHelper extends SQLiteOpenHelper {
    public static final String ITEM_NAME_TABLE="items_table";
    public static final String TYPE_NAME_TABLE="types_table";
    public static final String ITEM_NAME="name";
    public static final String ITEM_PRICE="price";
    public static final String ITEM_IMAGE_NAME="img_name";
    public static final String ITEM_TYPE="item_type";
    public static final String ID="_id";
}

我想按点击的类别查看项目,所以我写了这个方法:

public Cursor getlAllGifts(String category){
    return database.query(DatabaseOpenHelper.ITEM_NAME_TABLE, null, DatabaseOpenHelper.ITEM_TYPE+"="+ category, null, null, null, null);
}

我从先前的意图中传递了类别,但是当调用此方法时出现此错误

08-03 06:59:59.120: E/SQLiteLog(2696): (1) no such column: personal
08-03 06:59:59.120: W/dalvikvm(2696): threadid=12: thread exiting with uncaught exception (group=0xa4bfd648)
08-03 06:59:59.120: E/AndroidRuntime(2696): FATAL EXCEPTION: AsyncTask #2
08-03 06:59:59.120: E/AndroidRuntime(2696):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
08-03 06:59:59.120: E/AndroidRuntime(2696):     at java.lang.Thread.run(Thread.java:841)
08-03 06:59:59.120: E/AndroidRuntime(2696): Caused by: android.database.sqlite.SQLiteException: no such column: personal (code 1): , while compiling: SELECT * FROM items_table WHERE item_type=personal
08-03 06:59:59.120: E/AndroidRuntime(2696): Caused by: android.database.sqlite.SQLiteException: no such column: personal (code 1): , while compiling: SELECT * FROM items_table WHERE item_type=personal
08-03 06:59:59.120: E/AndroidRuntime(2696):     at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)

我有个人类别,但我不知道如何按特定类别(item_type)获取行,请帮助我

【问题讨论】:

    标签: android mysql sql sqliteopenhelper


    【解决方案1】:

    您能试试下面的查询吗?

    如果可行,那么,我会用更多细节更新答案:

    public Cursor getlAllGifts(String category){
        return database.query(DatabaseOpenHelper.ITEM_NAME_TABLE, null, DatabaseOpenHelper.ITEM_TYPE + " LIKE ? ", new String[]{category}, null, null, null, null);
    }
    

    背景

    如果你检查DOCS,你可以看到query()方法接受以下参数:

    query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) 
    

    您的代码是:

    database.query(DatabaseOpenHelper.ITEM_NAME_TABLE, null, DatabaseOpenHelper.ITEM_TYPE+"="+ category, null, null, null, null)
    

    因此,您将WHERE 语句设置在正确的位置。但是,你做得不好。然后,您的查询被转换为:

    SELECT * FROM items_table WHERE item_type=personal
    

    然后,SQLite 将 personal 作为列处理(而不是作为您的 where 条件)

    让 Android 解决问题

    其实你可以使用query()的第四个参数(selectionArgs[]),然后Android会为你创建where子句...你只需发送参数/参数。

    这样,在第三个参数中添加?,在第四个参数中添加android应该插入的参数来代替?

    因此,在我的示例中,我添加了:

    • 第三个参数:DatabaseOpenHelper.ITEM_TYPE + " LIKE ? "
    • 第四个参数:new String[]{category}

    然后,Android 将用您的论点 category 替换 ?

    【讨论】:

    • 它工作得很好,谢谢你...你能解释一下这段代码是如何工作的吗! :)
    • LIKE 的行为与 = 不同。
    • @WajdiFadool 正如 CL 所提到的。 Like 可能并不总是作为 = 起作用。因此,也许,您想测试相同的解决方案,但将“LIKE”更改为“=”
    • @WajdiFadool 如果这个答案适合并解决了你的问题,我只是请求接受这个答案以供将来参考。最好的问候
    猜你喜欢
    • 2013-01-10
    • 2018-06-03
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 2023-03-03
    相关资源
    最近更新 更多