更新SQLite数据库

3

我根据这个教程设置了一个SQLite数据库,将其更改为适合自己项目的样子:http://www.androidhive.info/2011/11/android-sqlite-database-tutorial/

然而,该教程没有说明如何更新字段。我尝试过以下方法:

db = new NotesDatabaseHandler(ViewNoteActivity.this);
...
db.updateNote(new Note(identifier, editTextTitle.getText().toString(), editTextContent.getText().toString(), "Updated on: " + printStandardDate()));

虽然一直尝试但是运行应用后,记事本文件没有更新。

记事本类:

package com.timmo.notes;

class Note {

//private variables
private int _id;
private String _title;
private String _content;
private String _metadata;

// Empty constructor
public Note() {

}

// constructor
public Note(int id, String title, String content, String metadata) {
    this._id = id;
    this._title = title;
    this._content = content;
    this._metadata = metadata;
}

public int getID() {
    return this._id;
}

public void setID(int id) {
    this._id = id;
}

public String getTitle() {
    return this._title;
}

public void setTitle(String title) {
    this._title = title;
}

public String getContent() {
    return this._content;
}

public void setContent(String content) {
    this._content = content;
}

public String getMetadata() {
    return this._metadata;
}

public void setMetadata(String metadata) {
    this._metadata = metadata;
}

}

来自NotesDatabaseHandler():

// Updating single note
public int updateNote(Note note) {
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(KEY_TITLE, note.getTitle());
    values.put(KEY_CONTENT, note.getContent());
    values.put(KEY_METADATA, note.getMetadata());

    // updating row
    int ret = db.update(TABLE_NOTES, values, KEY_ID + " = ?",
            new String[]{String.valueOf(note.getID())});
    db.close();
    return ret;
}

之前,我已经删除了这个笔记,然后再次添加,但是它被添加到数据库的末尾,而不是原来的位置。

那么问题来了,我该如何正确地更新我的一个笔记(联系人)呢?谢谢。

更新: 我尝试使用原始UPDATE:

public void updateNote(Note note) {
    SQLiteDatabase db = this.getWritableDatabase();

    String strSQL = "UPDATE "
            + TABLE_NOTES + " SET "
            + KEY_TITLE + "='" + note.getTitle() + "', "
            + KEY_CONTENT + "='" + note.getContent() + "', "
            + KEY_METADATA + "='" + note.getMetadata() + "'"
            + " WHERE " + KEY_ID + "='" + note.getID() + "'";
    Log.d("SQL: ", strSQL);
    db.execSQL(strSQL);
    db.close();
}

但是仍然没有任何反应。我的日志输出如下:

UPDATE notes SET title='hello', content='there', metadata='Updated on: 09:48 AM - 08 Aug 2015' WHERE id='7'

我看不出有什么问题...


请解释一下“Although have had no luck”的意思。例如,您是否遇到了崩溃?如果是这样,请使用LogCat来检查与您的崩溃相关联的Java堆栈跟踪:https://dev59.com/iGAg5IYBdhLWcg3wpMSz - CommonsWare
1
很可能,note.getID()没有返回表中任何行的KEY_ID列中相同的值。 - CommonsWare
为确保您更新正确的笔记,请获取所有笔记并查看返回的ID,然后您就可以确定了。 - Want2bExpert
你有没有改变数据库版本号? - Want2bExpert
你正在跟随四年前的AndroidHive教程。我想知道会出现什么问题... - njzk2
3个回答

2
你想要更新什么?要进行更新,你需要传递一个有效(存在的)行 ID(主键)。
  • 读取(获取 ID)
  • 编辑
  • 更新(使用旧的 ID)
请记住:

在冲突时

你也可以尝试使用原始内容:
String strSQL = "UPDATE myTable SET Column1 = someValue WHERE columnId = "+ someValue;
myDataBase.execSQL(strSQL);

或者尝试:
String where = "_id=" + note.getId(); 
myDataBase.update(table,cv,where,null) ;

我尝试了原始数据,但什么都没有发生...“UPDATE notes SET title ='hello fgwejfneqdfjoe',content ='there',metadata ='更新于:2015年8月8日上午06:48' WHERE id ='7'”,看起来应该被更新...
从您的SQL语句中去掉撇号。
如果您在数据库操作中使用SQL字符串,则很可能遇到了SQL语句中字符串的问题。一个撇号会破坏SQL字符串,导致SQL语句失败。
通过连接字符串构建SQL语句是不可取的。它是:
- 不可扩展 - 数据库将为每个SQL执行进行“硬解析” - 每个姓氏输入(如O'Connor或类似姓氏),所有格或缩写输入都容易失败。 - 如果直接使用输入参数值,则容易受到用户的SQL注入攻击。 如何转义SQL查询中的单引号?

我已经尝试了原始代码,但实际上什么也没有发生。以下是更新语句:"UPDATE notes SET title='hello fgwejfneqdfjoe', content='there', metadata='Updated on: 06:48 AM - 08 Aug 2015' WHERE id='7'",看起来应该会进行更新。 - Timmo

0

如果您在刷新值之前执行选择操作,可能只能调用更新方法,类似于这样:

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);
DatabaseHandler db = new DatabaseHandler(this);
/** * CRUD Operations * */ // 插入联系人 Log.d("插入: ", "正在插入.."); db.addContact(new Contact("Ravi", "9100000000")); db.addContact(new Contact("Srinivas", "9199999999")); db.addContact(new Contact("Tommy", "9522222222")); db.addContact(new Contact("Karthik", "9533333333"));
// 读取所有联系人 Log.d("读取: ", "正在读取所有联系人.."); List contacts = db.getAllContacts();
for (Contact cn : contacts) { Log.d("测试", "ID: "+cn.getID()+" ,姓名: " + cn.getName() + " ,电话: " + cn.getPhoneNumber());
if ("Tommy".equals(cn.getName()) { cn.setName("Timmo"); db.updateContact(cn); //类似于更新笔记 } }
Log.d("读取: ", "重新加载所有联系人.."); contacts = db.getAllContacts();
for (Contact cn : contacts) { if ("Timmo".equals(cn.getName()) { Log.d("测试", " 你好,Timmo"); } } }

0

我成功解决了我的问题。感谢 @Tomasz Best 提供的指引。

已修复 updateNote:

public void updateNote(Note note) {
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(KEY_TITLE, note.getTitle());
    values.put(KEY_CONTENT, note.getContent());
    values.put(KEY_METADATA, note.getMetadata());

    db.update(TABLE_NOTES, values, KEY_ID + " = ?",
            new String[]{String.valueOf(note.getID())});

    db.close();
}

调用语句:

db.updateNote(new Note(identifier, editTextTitle.getText().toString(), editTextContent.getText().toString(), "Updated on: " + printStandardDate()));

这些问题以及其他更新RecyclerView项目时出现的问题,我最终都已修复或创建了解决方案。现在应用程序运行完美无缺,并且我已经发布了一个更新到商店:https://play.google.com/store/apps/details?id=com.timmo.notes 我很快就会把源代码发布到github,并在描述中添加链接。
再次感谢所有帮助过我的人!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接