【问题标题】:How to update multiple sqlite rows based on query results (Android, SQLITE)如何根据查询结果更新多个 sqlite 行(Android、SQLITE)
【发布时间】:2012-04-01 10:44:32
【问题描述】:

我在 android 中执行了一个 rawQuery,它返回指向不同行的多个结果。

example:  Cursor cursor = db.rawQuery("Select id as _id, List_id, Street_id FROM Streets WHERE Street_id = 5, null);

在我的表中,这将返回两行:

List_id = 2, Street_id = 5 
List_id = 7, Street_id = 5

然后,我想在另一个表中为 List_id 2 和 List_id 7 对应的两行(即 _id = 3 和 _id = 8)更新一个单独的表中名为 Counter 的列。

我知道我将不得不做一些光标管理。但如果有人能给我一些一般的入门基础知识,我将不胜感激 - 我一直在努力解决这个问题。

更好的例子:

我在 Streets 表中查询 Street_id = 5 的所有记录。我得到两个结果。在这些返回的行中,我有一个名为 List_id 的列。两个 List_id 列中的数据分别是 2 和 5。然后我需要根据 _id 等于 2 和 5 更新名为 Counter my Lists 表的字段。

【问题讨论】:

    标签: android sqlite


    【解决方案1】:

    看起来您所要做的就是在更新查询中也包含 where 子句。

    String filter = "Street_id=" + 5; 
    ContentValues args = new ContentValues(); 
    args.put(Counter, "value"); 
    myDB.update("Streets", args, filter, null);
    

    应该做的工作

    编辑

    db.rawQuery("update Streets (Counter) Set (Value) Where Street_id=5, (Value) Where Street_id=5");
    

    这将更新两行中的值,您可以根据先前查询返回的行数动态生成此查询。

    编辑

    好的,我们试试

    db.rawQuery("update Lists (Counter) Set (Value) Where _id=2, (Value) Where _id=5");
    

    如果这不是您想要的或者您遇到问题的地方,请举例说明

    上面的查询将Lists 表中的Counter 列更新为Value,其中第一行的_id = 2 和第二行的_id=5

    【讨论】:

    • 实际上我打错了 - 请参阅上面的编辑。我实际上是在尝试根据我在初始查询中得到的结果更新不同表中的多行。
    • 我不确定我是否理解(抱歉)。基本上我需要从我的 STREETS 表中取出上面的两个 List_id 结果,然后更新我的 LISTS 表中与 List_id 对应的两行。 (我在 STREETS 中的 List_id 字段中的值等同于我在 LISTS 中的 _id 字段)。我确定我解释得不好:)
    • 我试图在我的原始帖子中添加一个更好的例子。我也非常感谢您的帮助。
    • 根据您的示例,我的第二个查询应该可以正常工作
    • 啊,我现在明白了。现在,在您的示例中,您实际上是在写出“2”和“5”。如何根据我之前的查询存储这些值以首先获取数据?目前我只能存储第一个,即“2”。 “5”被忽略。
    【解决方案2】:
    public class DatabaseHandler extends SQLiteOpenHelper {
    
        // All Static variables
        // Database Version
        private static final int DATABASE_VERSION = 1;
    
        // Database Name
        private static final String DATABASE_NAME = "android_api";
    
        // Login table name
        private static final String TABLE_LOGIN = "login";
    
        // Login Table Columns names
        private static final String KEY_ID = "id";
        private static final String KEY_NAME = "name";
        private static final String KEY_EMAIL = "email";
        private static final String KEY_UID = "uid";
        private static final String KEY_CREATED_AT = "created_at";
    
        public DatabaseHandler(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }
    
        // Creating Tables
        @Override
        public void onCreate(SQLiteDatabase db) {
            String CREATE_LOGIN_TABLE = "CREATE TABLE " + TABLE_LOGIN + "("
                    + KEY_ID + " INTEGER PRIMARY KEY,"
                    + KEY_NAME + " TEXT,"
                    + KEY_EMAIL + " TEXT UNIQUE,"
                    + KEY_UID + " TEXT,"
                    + KEY_CREATED_AT + " TEXT" + ")";
            db.execSQL(CREATE_LOGIN_TABLE);
        }
        public void addUser(String name, String email, String uid, String created_at) {
            SQLiteDatabase db = this.getWritableDatabase();
    
            ContentValues values = new ContentValues();
            values.put(KEY_NAME, name); // Name
            values.put(KEY_EMAIL, email); // Email
            values.put(KEY_UID, uid); // Email
            values.put(KEY_CREATED_AT, created_at); // Created At
    
            // Inserting Row
            db.insert(TABLE_LOGIN, null, values);
            db.close(); // Closing database connection
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-25
      • 2013-10-16
      • 1970-01-01
      相关资源
      最近更新 更多