通过遵循教程学习如何在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();
}
答案 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();
}
除了创建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;
因此返回更新的行数。