【问题标题】:Storing data to sqlite将数据存储到 sqlite
【发布时间】:2018-11-30 05:42:38
【问题描述】:
MainData helper = new MainData(this);name
    SQLiteDatabase db = helper.getWritableDatabase();        

String uid = MessageRecieverId;
    int userData = 0;
    Cursor data2 = helper.getUserData();
    while (data2.moveToNext()) {
        userData = data2.getInt(data2.getColumnIndex(KEY_MESSAGES_SENT));
    }
    ContentValues contentValues2 = new ContentValues();
    contentValues2.put(KEY_ID, uid);
    contentValues2.put(KEY_MESSAGES_SENT, userData+1);
    long returnVariable2 = db.update(TABLE_USER_DATA, contentValues2,null,null);
    if (returnVariable2 == -1) {
        Toast.makeText(getApplication(), "Nope", Toast.LENGTH_LONG).show();
        //-1 means there was an error updating the values
    } else {
        Toast.makeText(getApplication(),"uf", Toast.LENGTH_SHORT).show();
    }
}

userData+1 应该只对 KEY_ID = uid 的行执行,但它会将所有行的值更改为 +1 而不仅仅是... MessageRecieverId 不同,但数据将其更改为所有行...任何人都可以帮忙我解决这个问题?

帮手

    String userQuery = "CREATE TABLE IF NOT EXISTS " + TABLE_USER_DATA + "(" + KEY_ID + " TEXT, " + KEY_NAME
            + " TEXT, " + KEY_MESSAGES_SENT + " INTEGER, " + KEY_MESSAGES_RECIEVED + " INTEGER, "
            + KEY_MESSAGES + " INTEGER, " + KEY_TIME_SPENT + " TEXT)";

方法

    public Cursor getUserData() {
    SQLiteDatabase db = this.getWritableDatabase();
    String query = "SELECT * FROM " + TABLE_USER_DATA;
    return db.rawQuery(query, null);
}

我在查看答案后添加了 where 子句并收到一条错误消息,指出不存在此类列

添加默认数据

public void Start(){
    MainData helper = new MainData(this); //Change the name to your Helper Class name
    SQLiteDatabase db = helper.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(KEY_ID, MessageRecieverId);
    contentValues.put(KEY_NAME, MessageRecieverName);
    contentValues.put(KEY_MESSAGES_SENT, 0);
    contentValues.put(KEY_MESSAGES_RECIEVED, 0);
    contentValues.put(KEY_MESSAGES, 0);
    contentValues.put(KEY_TIME_SPENT, "");

    long returnVariable = db.insert(TABLE_USER_DATA,null,contentValues);
    if (returnVariable == -1) {
        Toast.makeText(getApplication(), "Nope", Toast.LENGTH_LONG).show();
        //-1 means there was an error updating the values
    } else {
        Toast.makeText(getApplication(),"Done", Toast.LENGTH_SHORT).show();
        SharedPreferences sp = getSharedPreferences(MessageRecieverId, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
        editor.putBoolean("Data", true); //save that the user enters username
        editor.apply();
    }

}

像这样添加数据后,我将其增加一,但显示错误

 Process: com.appmaster.akash.messageplus, PID: 24433
                                                                             android.database.sqlite.SQLiteException: no such column: eR3C1LXJhzaK3fPzCpcuTuz9jZB3 (code 1): , while compiling: UPDATE UserData SET MessagesSent=? WHERE RecieversID =eR3C1LXJhzaK3fPzCpcuTuz9jZB3
                                                                                 at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
                                                                                 at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
                                                                                 at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
                                                                                 at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
                                                                                 at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
                                                                                 at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
                                                                                 at android.database.sqlite.SQLiteDatabase.updateWithOnConflict(SQLiteDatabase.java:1577)
                                                                                 at android.database.sqlite.SQLiteDatabase.update(SQLiteDatabase.java:1525)
                                                                                 at com.appmaster.akash.messageplus.Chat.mMessagesSent(Chat.java:913)
                                                                                 at com.appmaster.akash.messageplus.Chat.sendMessage(Chat.java:704)
                                                                                 at com.appmaster.akash.messageplus.Chat.access$900(Chat.java:75)
                                                                                 at com.appmaster.akash.messageplus.Chat$5.onClick(Chat.java:441)
                                                                                 at android.view.View.performClick(View.java:6256)
                                                                                 at android.view.View$PerformClick.run(View.java:24701)
                                                                                 at android.os.Handler.handleCallback(Handler.java:789)
                                                                                 at android.os.Handler.dispatchMessage(Handler.java:98)
                                                                                 at android.os.Looper.loop(Looper.java:164)
                                                                                 at android.app.ActivityThread.main(ActivityThread.java:6541)
                                                                                 at java.lang.reflect.Method.invoke(Native Method)
                                                                                 at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
                                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

【问题讨论】:

  • 没有给出更新条件不是吗?

标签: java android sql database sqlite


【解决方案1】:

您正在将db.update 调用中的where 子句和where args 参数专门设置为null。这就是该命令更新所有行的原因,因为没有 where 子句。

您需要更改此行中的最后两个参数:

long returnVariable2 = db.update(TABLE_USER_DATA, contentValues2,null,null);

以下是官方文档中的详细信息:

https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#update(java.lang.String,%20android.content.ContentValues,%20java.lang.String,%20java.lang.String[])

【讨论】:

    【解决方案2】:

    UPDATE 将更新每一行,除非您指定要更新的行。

    因此long returnVariable2 = db.update(TABLE_USER_DATA, contentValues2,null,null);

    因为选择(第三个参数)是 null 将更新每一行。

    选择是一个 WHERE 子句(减去 WHERE 关键字);第 4 个参数可用于将参数传递到 WHERE 子句中,逐一替换 ?

    • 以这种方式传递参数的优点是它们将被正确封装/处理,并且
    • 提供针对 SQL 注入的保护。

    例如您很可能想要以下内容:-

    //contentValues2.put(KEY_ID, uid); //<<<<<<<<<< YOU PROBABLY DO NOT WANT TO CHANGE THE ID, so commented out
    contentValues2.put(KEY_MESSAGES_SENT, userData+1);
    String whereclause = KEY_ID + "=?";
    String[] whereargs = new String[]{uid};
    long returnVariable2 = db.update(TABLE_USER_DATA, contentValues2,whereclause,whereargs);
    

    请注意,更新返回的 int 不是很长,而且它永远不会是 -1,因为它是已更新的行数,因此为 0 或更大。所以你需要为 Toast 检查 0 而不是 -1

    【讨论】:

    • @NikkiZepher Ooops 错误地键入了 whereargs 行,它应该是 String[] whereargs = new String[]{uid}; 。即方括号后的花括号。
    • 因为方括号内的值是数组中元素的数量,所以有一个元素它抓取了值 eR3C1LXJhzaK3fP​​zCpcuTuz9jZB3,它没有被括起来用引号引起来,因为它是字符串而不是数字 SQL 认为它是列名。
    • 你的代码下面有一条红线,所以我尝试了 In.parse Int 这样但得到一个错误 String[] whereargs = new String[Integer.parseInt(uid)];
    • 致命异常:主进程:com.appmaster.akash.messageplus,PID:31033 java.lang.NumberFormatException:对于输入字符串:“eR3C1LXJhzaK3fP​​zCpcuTuz9jZB3”在 java.lang.Integer.parseInt(Integer.java :608) 在
    • Integer.parseint(???) 接受一个字符串并将其转换为一个整数,您认为 eR3C1LXJhzaK3fP​​zCpcuTuz9jZB3 是多少?我建议再次复制 sn-p(经过测试,语法正确)
    【解决方案3】:
        ContentValues cv = new ContentValues();
        cv.put("isSynced", 1);
        db.update(TABLE_NAME, cv, "id =" + recID, null);
    

    使用 where 条件更新代码。希望能成功

    【讨论】:

    • 例外是没有这样的列
    • 是的,我明白了...但是为什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 2015-02-05
    • 1970-01-01
    • 2014-04-07
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多