Как обновить запись?Приложение SQlite / Android / ToDo - PullRequest
0 голосов
/ 24 мая 2018

Обучение программированию на Android с помощью учебника, но я пытаюсь также обновить запись в базе данных, хотя и не совсем, как это сделать.Любая помощь, пожалуйста?

package dev.edmt.todolist;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import java.util.ArrayList;

/**
 * Created by reale on 06/10/2016.
 */

public class DbHelper extends SQLiteOpenHelper {

    private static final String DB_NAME="EDMTDev";
    private static final int DB_VER = 1;
    public static final String DB_TABLE="Task";
    public static final String DB_COLUMN = "TaskName";

    public DbHelper(Context context) {
        super(context, DB_NAME, null, DB_VER);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String query = String.format("CREATE TABLE %s (ID INTEGER PRIMARY KEY AUTOINCREMENT,%s TEXT NOT NULL);",DB_TABLE,DB_COLUMN);
        db.execSQL(query);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        String query = String.format("DELETE TABLE IF EXISTS %s",DB_TABLE);
        db.execSQL(query);
        onCreate(db);

    }

    public void insertNewTask(String task){
        SQLiteDatabase db= this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(DB_COLUMN,task);
        db.insertWithOnConflict(DB_TABLE,null,values,SQLiteDatabase.CONFLICT_REPLACE);
        db.close();
    }

    public void editTask(String task){
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(DB_COLUMN,task);

        db.update(DB_TABLE,values,DB_COLUMN + " = " + task,null) > 0;
        db.close();
    }

    public void deleteTask(String task){
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(DB_TABLE,DB_COLUMN + " = ?",new String[]{task});
        db.close();
    }

    public ArrayList<String> getTaskList(){
            ArrayList<String> taskList = new ArrayList<>();
            SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.query(DB_TABLE,new String[]{DB_COLUMN},null,null,null,null,null);
        while(cursor.moveToNext()){
            int index = cursor.getColumnIndex(DB_COLUMN);
            taskList.add(cursor.getString(index));
        }
        cursor.close();
        db.close();
        return taskList;
    }
}

Точнее говоря, не могу сказать, что я вполне понимаю, как это работает:

public void editTask(String task){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(DB_COLUMN,task);

db.update(DB_TABLE,values,DB_COLUMN + " = " + task,null) > 0;
db.close();
}

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Точнее говоря, я не могу сказать, что я вполне понимаю, как это работает:

Это может работать, как в обычном режиме, но, как объяснено ниже, вероятно, работаетничего бесполезного.

Метод SQLiteDatabase update - это удобный способ выдачи SQL для выполнения обновления.Он записывает / создает базовый SQl, выполняет его, а также возвращает результат (количество обновленных строк).

Используя ваш код в качестве примера, выполните то же самое, не используя метод update, который вы могли бысоздайте SQL: -

UPDATE Task SET TaskName = 'your_value' WHERE Task = 'your_value'
  • Обратите внимание, что это на самом деле бесполезно, поскольку вы фактически говорите (предполагая для демонстрации, что значение, переданное методу editTask, равно task001 ) * * один тысяча двадцать-одна; Обновление строк (-ов) задач, которые имеют / имеют значение task001 в столбце TaskName и должны быть изменены с task001 на task001 .

  • Обратите внимание, что метод update использует UPDATE OR IGNORE......, поэтому: -

  • Когда происходит применимое нарушение ограничения, алгоритм разрешения IGNORE пропускает одну строку, содержащую нарушение ограничения, и продолжает обрабатывать последующие строки оператора SQL, как будто ничего не пошло не так.Другие строки до и после строки, содержащей нарушение ограничения, вставляются или обновляются нормально.Ошибка не возвращается при использовании алгоритма разрешения конфликтов IGNORE. SQL в понимании SQLite - ON ON CONFLICT

Предложение

Возможно, что было бы более полезным, если, скажем, вы хотите изменить строку, которая раньшеобновление имеет значение task001 .Изменив его, скажем, на task002 .

, в этом случае SQL может быть: -

UPDATE Task SET TaskName = 'your_new_value' WHERE Task = 'your_original_value'

Ваш метод editTask может быть таким: -

public void editTask(String original_task, String new_task){
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(DB_COLUMN,new_task);
    db.update(DB_TABLE,values,DB_COLUMN + " = '" + original_task + "'" ,null) > 0;
    db.close();
}
  • например, используя edittask("task001","task002");

  • Обратите внимание, как значение original_task заключено в одинарные кавычки.

Однако , рекомендуемый способ, будет использовать аргументы (которые будут автоматически заключены в кавычки), так что выше может быть: -

public void editTask(String original_task, String new_task){
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(DB_COLUMN,new_task);
    String[] whereargs = new String[]{original_task};
    db.update(DB_TABLE,values,DB_COLUMN + "=?",whereargs) > 0;
    db.close();
}
  • каждый ? закодировано в WHERECLAUSE (3-й параметр), заменено соответствующим аргументом в WHEREARGS (4-й параметр) 1 к 1.

Дополнительно

В дополнение к созданию SQL, метод update также вызывает SQL, используя соответствующие средства, например, он делает для вас эквивалент db.execSQL(your_sql).


Дополнительно в случае update онзатем делает эквивалент: -

Cursor csr = db.rawQuery("SELECT total_changes()",null);
int total_changes = 0;
if(csr.moveToFirst()) {
    total_changes = csr.getInt(0);
}
return total_changes;

Следовательно, возвращает количество обновленных строк.

0 голосов
/ 24 мая 2018

db.update метод создаст оператор SQL в соответствии с заданными вами параметрами и выполнит его.Вы можете увидеть метод db.update(), чтобы лучше понять.

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