簡體   English   中英

如何為數據庫中的相似對象執行太多的多功能操作?

[英]How can I do too many multi function for similar objects in database?

我的SQLite數據庫有5列。

  1. ID
  2. 意思
  3. 不同的均值
  4. 顏色

首先,我有一個Listview,它處於不同的活動中。並且我正在通過Button從Main Activity加載數據。 我想添加數據,但是當我添加數據時,列表視圖中有相同的數據(İt是第二列(單詞))。 數據刪除本身,其他相同的數據到達列表視圖的頂部,並將其顏色更改為其他顏色。

這怎么看:從1.任何東西(白色)2.東西(白色)3.不同(白色)4.東西(白色)

  1. 東西(紅色)
  2. 任何東西(白色)
  3. 不同(白色)

我的數據庫:

class DatabaseHelper extends SQLiteOpenHelper {
private static final String TAG = "DatabaseHelper";


private static final String TABLE_NAME = "kartlarim";
private static final String COL1 = "ID";
private static final String COL2 = "name";
private static final String COL3 = "anlam";
private static final String COL4 = "akli_göz";
private static final String COL5 = "boya";

public DatabaseHelper(Context context) {
    super(context, TABLE_NAME, null, 1);
}


@Override
public void onCreate(SQLiteDatabase db) {
    String createTable = "CREATE TABLE " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, " +  COL2 + " TEXT,"+
            COL3 + " TEXT,"+ COL4  + " TEXT," +COL5 + " TEXT)";
    db.execSQL(createTable);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP IF TABLE EXISTS " + TABLE_NAME);
    onCreate(db);
}
public boolean addData(String item , String number  , String anlam) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(COL2, item);
    contentValues.put(COL3 , number);
    contentValues.put(COL4, anlam);
    contentValues.put(COL5 ,"#419FEE");

    Log.d(TAG, "addData: Adding " + item + " to " + TABLE_NAME);

    long result = db.insert(TABLE_NAME, null, contentValues);

    //if date as inserted incorrectly it will return -1
    if (result == -1) {
        return false;
    } else {
        return true;
    }
}

數據庫更新數據:

public String update(String table, ContentValues data, String where, String[] whereArgs) {
    SQLiteDatabase db = this.getWritableDatabase();
    //  String where = "id=?";
    //    String[] whereArgs = new String[] {String.valueOf(id)};
    try {
        long returnId = db.update(table, data, where, whereArgs);
        if (returnId > 0) {
            db.close();
            return "Success";
        } else {
            db.close();
            return "fail";
        }
    } catch (Exception e) {
        String error = e.getMessage().toString();
        db.close();
        return error;
    }
}

刪除行:

  public void deleteAllName(int id, String name ,String anlam, String akli){
        SQLiteDatabase db = this.getWritableDatabase();
        String query = "DELETE FROM " + TABLE_NAME + " WHERE "
                + COL1 + " = '" + id   + "' AND "
                + COL2 + " = '" + name + "' AND "
                + COL3 + " = '"+ anlam +"' AND "
                + COL4 + " = '"+ akli + "'";
        Log.d(TAG, "deleteName: query: " + query);
        Log.d(TAG, "deleteName: Deleting " + name + " from database.");
        db.execSQL(query);
    }

我的數組:

  Cursor data = mDatabase.getData();
    while (data.moveToNext()){


        kelimeler_id_array.add(data.getString(0));
        kelimeler_array.add(data.getString(1)) ;
        akli_göz_array.add(data.getString(2));
       kelimelerin_anlamı_array.add(data.getString(3));
        boya_array.add(data.getString(4));

    }

按鈕聲明:

       String user_words_unknown =  user_unknown_words_edittext.getText().toString();

// simply add to database.
            if (!kelimeler_array.contains(user_words_unknown)){


                mDatabase.addData(user_words_unknown, "","");
            }


    //Here , is my problem
          if (kelimeler_array.contains(user_words_unknown)) {

              mDatabase.addData(user_words_unknown, "","");


          }

如果我正確理解了您的問題,那么您的問題是,如果COL2的值已經存在,則您不想插入(添加)新行。 那就是您實際上希望COL2唯一的

正確的方法是將列聲明為UNIQUE ,也聲明為NOT NULL (因為您要確保null永遠不會插入具有null的行)。

所以代替:-

@Override
public void onCreate(SQLiteDatabase db) {
    String createTable = "CREATE TABLE " + 
            TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, " +  
            COL2 + " TEXT,"+
            COL3 + " TEXT,"+ 
            COL4  + " TEXT," +
            COL5 + " TEXT
            )";
    db.execSQL(createTable);
}

你可以有 :-

@Override
public void onCreate(SQLiteDatabase db) {
    String createTable = "CREATE TABLE " + 
            TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, " +  
            COL2 + " TEXT UNIQUE NOT NULL," + //<<<< changed
            COL3 + " TEXT,"+ 
            COL4  + " TEXT," +
            COL5 + " TEXT
            )";
    db.execSQL(createTable);
}

以上將工作,並且不會插入重復項。 但是,您將記錄一個錯誤,但沒有例外。 要禁止輸出到日志,您可能需要使用:-

public boolean addData(String item , String number  , String anlam) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(COL2, item);
    contentValues.put(COL3 , number);
    contentValues.put(COL4, anlam);
    contentValues.put(COL5 ,"#419FEE");

    Log.d(TAG, "addData: Adding " + item + " to " + TABLE_NAME);

    long result = db.insertWithOnConflict(TABLE_NAME, 
        null, 
        contentValues, 
        SQLiteDatabase.CONFLICT_IGNORE
    );

    //if date as inserted incorrectly it will return -1
    if (result == -1) {
        return false;
    } else {
        return true;
    }
}
  • 使用insertWithOnConflict而不是insert允許第四個參數指定如何處理約束沖突UNIQUENOT NULL是表現在具有的約束 )。 在這種情況下,您想忽略約束違例

  • 注意! 要實現此目的,請在修改代碼后執行以下操作之一:

    • 增加版本號
    • 刪除應用程序的數據
    • 卸載應用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM