2013-01-24 57 views
0

如果我提出相同的评论(例如:“www.google.lv”),它会再次创建此评论。我想这种感觉不能被复制,而是被创造出最新的。我包括insertWithOnConflict,但它不工作。 有我的代码:为什么SOlite更换不起作用?

public class SQLiteAdapter { 

public static final String MYDATABASE_NAME = "MY_DATABASE"; 
public static final String MYDATABASE_TABLE = "MY_TABLE"; 
public static final int MYDATABASE_VERSION = 1; 
public static final String KEY_ID = "_id"; 
public static final String KEY_CONTENT = "Content"; 

//create table MY_DATABASE (ID integer primary key, Content text not null); 
private static final String SCRIPT_CREATE_DATABASE = 
"create table " + MYDATABASE_TABLE + " (" 
+ KEY_ID + " integer primary key autoincrement, " 
+ KEY_CONTENT + " text not null);"; 

private SQLiteHelper sqLiteHelper; 
private SQLiteDatabase sqLiteDatabase; 

private Context context; 

public SQLiteAdapter(Context c){ 
context = c; 
} 

public SQLiteAdapter openToRead() throws android.database.SQLException { 
sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null, MYDATABASE_VERSION); 
sqLiteDatabase = sqLiteHelper.getReadableDatabase(); 
return this; 
} 

public SQLiteAdapter openToWrite() throws android.database.SQLException { 
sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null, MYDATABASE_VERSION); 
sqLiteDatabase = sqLiteHelper.getWritableDatabase(); 
return this; 
} 

public void close(){ 
sqLiteHelper.close(); 
} 

public long insert(String content){ 

ContentValues contentValues = new ContentValues(); 
contentValues.put(KEY_CONTENT, content); 
return sqLiteDatabase.insertWithOnConflict(MYDATABASE_TABLE, null, contentValues, SQLiteDatabase.CONFLICT_REPLACE); 
} 

public int deleteAll(){ 
return sqLiteDatabase.delete(MYDATABASE_TABLE, null, null); 
} 

public List<Comment> getAllComments() { 
    List<Comment> comments = new ArrayList<Comment>(); 
    String[] columns = new String[]{KEY_ID, KEY_CONTENT}; 
    Cursor cursor = sqLiteDatabase.query(MYDATABASE_TABLE, 
      columns, null, null, null, null, null); 

    cursor.moveToFirst(); 
    while (!cursor.isAfterLast()) { 
     Comment comment = cursorToComment(cursor); 
     comments.add(comment); 
     cursor.moveToNext(); 
    } 
    // Make sure to close the cursor 
    cursor.close(); 
    return comments; 

    } 
private Comment cursorToComment(Cursor cursor) { 
    Comment comment = new Comment(); 
    comment.setId(cursor.getLong(0)); 
    comment.setComment(cursor.getString(1)); 
    return comment; 
    } 
public List queueAll(){ 
String[] columns = new String[]{KEY_ID, KEY_CONTENT}; 
Cursor cursor = sqLiteDatabase.query(MYDATABASE_TABLE, columns, 
    null, null, null, null, null); 
cursor.moveToFirst(); 
    cursor.moveToNext(); 


return null; 
} 

public class SQLiteHelper extends SQLiteOpenHelper { 

public SQLiteHelper(Context context, String name, 
    CursorFactory factory, int version) { 
super(context, name, factory, version); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
// TODO Auto-generated method stub 
db.execSQL(SCRIPT_CREATE_DATABASE); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
// TODO Auto-generated method stub 

} 

} 

}

+0

[叹气]什么不工作意味着什么?我们需要猜测吗? – Simon

回答

0

其实你滥用insertWithOnConflict。在您的方法中插入您不提供ContentValues的ID列,因此insertWithOnConflict只是添加了具有新ID和现有内容的另一个记录。 insertWithOnConflict将有助于您提供表中已存在的id(您的主键)。 在你的情况下,你应该首先找到现有评论的ID,然后更新它或插入一个新的评论。

+0

如果我理解他的帖子是正确的,他希望最新的插入获得新的_id;因此指定_id不会这样做。他可能需要做的是在内容列上设置唯一索引并使用insertwithOnConflict,以便在重复冲突的情况下删除前一行。但是,我并不熟悉SQLite的语法来显示正确的示例。 – SylvainL

+0

据我了解,他需要避免评论重复,这就是为什么他试图使用insertWithOnConflict。是的,你是对的,在评论领域uniqie索引应该做的伎俩。 – slkorolev