更新SQLite数据库

时间:2015-08-07 22:50:38

标签: java android sql database sqlite

我在本教程中设置了一个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'

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

3 个答案:

答案 0 :(得分:2)

您想要更新什么?要进行更新,您需要传递有效(=现有)行ID(主键)

  • 读取(获取ID)
  • 编辑
  • 更新(使用旧ID)

请记住

on conflict

您也可以尝试使用raw:

String strSQL = "UPDATE myTable SET Column1 = someValue WHERE columnId = "+ someValue;
myDataBase.execSQL(strSQL);

或尝试:

String where = "_id=" + note.getId(); 
myDataBase.update(table,cv,where,null) ;
  

我尝试过原始但实际上并没有发生任何事情......“更新说明SET title ='hello fgwejfneqdfjoe',content ='there',metadata ='更新于:06:48 AM - 2015年8月8日'WHERE id = '7'“看起来应该更新..

从你的sql语句中删除Apostrophe

如果在数据库操作中使用SQL字符串,则可能在SQL语句中遇到字符串问题。一个撇号将SQL字符串搞砸,导致SQL语句失败。

建议不要通过连接字符串来构建SQL语句。它是:

  • 不可扩展 - 数据库将在每次执行SQL时“硬解析” -
  • 对于像O'Connor(或类似的姓氏),所有权或合同输入的每个姓氏输入都容易失败。
  • 如果输入参数值按原样使用,则
  • 易受用户SQL注入攻击。

How do I escape single quotes in SQL queries?

答案 1 :(得分:0)

只有在执行select before before刷新值时才可以调用update方法,我认为这样:

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        DatabaseHandler db = new DatabaseHandler(this);

        /**
         * CRUD Operations
         * */
        // Inserting Contacts
        Log.d("Insert: ", "Inserting .."); 
        db.addContact(new Contact("Ravi", "9100000000"));        
        db.addContact(new Contact("Srinivas", "9199999999"));
        db.addContact(new Contact("Tommy", "9522222222"));
        db.addContact(new Contact("Karthik", "9533333333"));

        // Reading all contacts
        Log.d("Reading: ", "Reading all contacts.."); 
        List contacts = db.getAllContacts();       

        for (Contact cn : contacts)
        {
            Log.d("TEST", "Id: "+cn.getID()+" ,Name: " + cn.getName() + " ,Phone: " + cn.getPhoneNumber());

            if ("Tommy".equals(cn.getName())
            {
                cn.setName("Timmo");
                db.updateContact(cn); //like your updateNote
            }
        }

        Log.d("Reading: ", "Reeeeload all contacts.."); 
        contacts = db.getAllContacts();       

        for (Contact cn : contacts)
        {
            if ("Timmo".equals(cn.getName())
            {
                Log.d("TEST", " Hello Timmo");
            }
        }   
    }

答案 2 :(得分:0)

我设法解决了我的问题。感谢@Tomasz最好的指示。

修正了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,并添加一个指向描述的链接。

再次感谢所有帮助过的人!