Хранение данных в sqlite - PullRequest
0 голосов
/ 30 ноября 2018
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)

Ответы [ 3 ]

0 голосов
/ 30 ноября 2018
    ContentValues cv = new ContentValues();
    cv.put("isSynced", 1);
    db.update(TABLE_NAME, cv, "id =" + recID, null);

обновить код с условием где.Надеюсь, что это будет работать

0 голосов
/ 30 ноября 2018

Вы специально устанавливаете свое предложение where и параметр where args в вызове db.update на 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[])

0 голосов
/ 30 ноября 2018

UPDATE будет обновлять каждую строку, если вы не укажете, какие строки обновлять.

Таким образом, long returnVariable2 = db.update(TABLE_USER_DATA, contentValues2,null,null);,

в качестве выбора (3-й параметр) будет 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, а не long, и что оно никогда не будет равно -1, так как это число строк, которые были обновлены, поэтому 0 или больше.Так что вам нужно проверить 0, а не -1 для тоста

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...