如何更新条目? SQlite / Android / ToDo应用程序

时间:2018-05-24 01:35:20

标签: java android database sqlite

通过遵循教程学习如何在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 :(得分:0)

db.update方法将根据您给定的参数创建SQL语句并执行它。您可以看到db.update()方法以更好地理解。

答案 1 :(得分:0)

  

更具体地说,这部分,真的说我完全理解了   它的工作方式:

它可能会起作用,但不会失败,但如下所述,它可能没有任何用处。

SQLiteDatabase update方法是发出SQL以执行更新的便捷方式。它写入/创建底层SQl,执行它,并返回结果(更新的行数)。

使用您的代码作为示例,在不使用update方法的情况下执行类似操作,您可以创建SQL: -

UPDATE Task SET TaskName = 'your_value' WHERE Task = 'your_value'
  • 请注意,这实际上是无用的,因为您实际上是在说(假设演示传递给editTask方法的值是 task001 ; 更新 任务名列中 task001 值>要更改 task001 的任务行 strong>到 task001

  • 请注意,update方法使用UPDATE OR IGNORE......,因此: -

  
      
  • 当发生适用的约束违规时,IGNORE解析算法会跳过包含约束的一行   违规并继续处理SQL的后续行   声明好像没有出错。之前和之后的其他行   插入或更新包含约束违规的行   一般。 IGNORE冲突解决时不会返回错误   使用算法。 SQL As Understood By SQLite - ON CONFLICT clause
  •   

建议

如果您想在更新前更改一行,其值为 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();
}
  • e.g。使用edittask("task001","task002");

  • 注意raw_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个参数)中的相应参数中逐个替换。

其他

除了创建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;

因此返回更新的行数。