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

Java 如何更新条目?SQlite/Android/ToDo应用程序,java,android,database,sqlite,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.dat

通过以下教程学习如何在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;
    }
}

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

更具体地说,这一部分,不能说我很理解 工作方式:

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();
}
它可能会工作,就像在notfail中一样,但正如下面解释的,它可能没有任何用处。

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

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

UPDATE Task SET TaskName = 'your_value' WHERE Task = 'your_value'
  • 请注意,正如您所说的那样,这实际上是无用的(假设传递给editTask方法的值是task001更新TaskName列中具有值task001的任务行,以将其从task001更改为task001

  • 注意
    update
    方法使用
    update或IGNORE…
    so:-

  • 当发生适用的约束冲突时,忽略解析算法将跳过包含该约束的一行 并继续处理SQL的后续行 好像没出什么差错似的陈述。前和后的其他行 将插入或更新包含约束冲突的行 正常地忽略冲突解决时不返回任何错误 算法被使用
暗示 如果您想更改更新前具有值task001的行,那么什么可能更有用呢。将其更改为task002

在这种情况下,SQL可以是:-

UPDATE Task SET TaskName = 'your_new_value' WHERE Task = 'your_original_value'
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();
}
然后,您的
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.使用编辑任务(“task001”、“task002”)

  • 注意原值任务是如何用单引号括起来的

但是推荐的方法是使用参数(自动用引号括起来),因此上述内容可以是:-

UPDATE Task SET TaskName = 'your_new_value' WHERE Task = 'your_original_value'
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();
}
  • 每个编码在WHERE子句(第3个参数)中,由WHERERERGS(第4个参数)中的相应参数以1比1的方式替换

附加的 除了创建SQL外,
update
方法还使用适当的方法调用SQL,例如,它为您执行与
db.execSQL(您的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;
因此返回更新的行数