2013-06-15 3 views
0

У меня есть следующий код, но у меня возникают проблемы с дубликатами. Как я могу изменить код, чтобы он не позволял дублировать в базе данных? Я использую его для включения AutoCompleteTextView, чтобы дубликаты не помогали. Спасибо большое!SQLite duplicate entry

package com.giantflyingsaucer; 

import android.database.*; 
import android.database.sqlite.*; 
import android.content.ContentValues; 
import android.content.Context; 
import android.util.Log; 

public class SQLiteCountryAssistant extends SQLiteOpenHelper 
{ 
private static final String DB_NAME = "usingsqlite.db"; 
private static final int DB_VERSION_NUMBER = 1; 
private static final String DB_TABLE_NAME = "countries"; 
private static final String DB_COLUMN_1_NAME = "country_name"; 

private static final String DB_CREATE_SCRIPT = "create table " + DB_TABLE_NAME + 
         " (_id integer primary key autoincrement, country_name text not null);)"; 

private SQLiteDatabase sqliteDBInstance = null; 

public SQLiteCountryAssistant(Context context) 
{ 
    super(context, DB_NAME, null, DB_VERSION_NUMBER); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
{ 
    // TODO: Implement onUpgrade 
} 

@Override 
public void onCreate(SQLiteDatabase sqliteDBInstance) 
{ 
    Log.i("onCreate", "Creating the database..."); 
    sqliteDBInstance.execSQL(DB_CREATE_SCRIPT); 
} 

public void openDB() throws SQLException 
{ 
    Log.i("openDB", "Checking sqliteDBInstance..."); 
    if(this.sqliteDBInstance == null) 
    { 
     Log.i("openDB", "Creating sqliteDBInstance..."); 
     this.sqliteDBInstance = this.getWritableDatabase(); 

    } 
} 

public void closeDB() 
{ 
    if(this.sqliteDBInstance != null) 
    { 
     if(this.sqliteDBInstance.isOpen()) 
      this.sqliteDBInstance.close(); 
    } 
} 

public long insertCountry(String countryName) 
{ 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put(DB_COLUMN_1_NAME, countryName); 
    Log.i(this.toString() + " - insertCountry", "Inserting: " + countryName); 
    return this.sqliteDBInstance.insert(DB_TABLE_NAME, null, contentValues); 
} 

public boolean removeCountry(String countryName) 
{ 
    int result = this.sqliteDBInstance.delete(DB_TABLE_NAME, "country_name='" + countryName + "'", null); 

    if(result > 0) 
     return true; 
    else 
     return false; 
} 

public long updateCountry(String oldCountryName, String newCountryName) 
{ 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put(DB_COLUMN_1_NAME, newCountryName); 
    return this.sqliteDBInstance.update(DB_TABLE_NAME, contentValues, "country_name='" + oldCountryName + "'", null); 
} 

public String[] getAllCountries() 
{ 
    Cursor cursor = this.sqliteDBInstance.query(DB_TABLE_NAME, new String[] {DB_COLUMN_1_NAME}, null, null, null, null, null); 

    if(cursor.getCount() >0) 
    { 
     String[] str = new String[cursor.getCount()]; 
     int i = 0; 

     while (cursor.moveToNext()) 
     { 
      str[i] = cursor.getString(cursor.getColumnIndex(DB_COLUMN_1_NAME)); 
      i++; 
     } 
     return str; 
    } 
    else 
    { 
     return new String[] {}; 
    } 
} 
} 

ответ

1

Одним из вариантов было бы назвать removeCountry из метода insertCountry, прежде чем на самом деле делать вставку. В качестве альтернативы вы можете изменить структуру своей базы данных на country_name text not null unique. Затем SQLite выкинет исключение, если вы не получите ограничение, которое вам нужно поймать и обработать соответствующим образом.

И, наконец, другой вариант заключается в попытке запроса базы данных для данной строки, если она существует, не вставлять, если она не вставляет ее.

+0

у меня есть аналогичный вопрос вставив телефонные номера в базу данных KEY_PH_NO + «TEXT NOT NULL UNIQUE» я попробовал это, и это не выбрасывает исключение, даже при вставке дубликатов. что-то не так, или я что-то упускаю. KEY_PH_NO - это имя столбца – Raghunandan

1

Вы можете использовать функцию, чтобы узнать, существуют ли данные в базе данных.

public boolean checkIfDataExists(String country) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor c = db.query(TABLE_NAME, columns, null, null, null, null, null); 
    int iCountry = c.getColumnIndex(KEY_COUNTRY); 
    for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) { 
     if (country.equals(c.getString(iCountry))) { 
      db.close(); 
      return true; 
     } 
    } 
    db.close(); 
    return false; 
} 

Вызов этой функции в if заявление и выполнить команду вставки, если условие не выполняется.

0

Я пробовал это, и он отлично работает, по крайней мере, до сих пор.

private static final String DB_CREATE_SCRIPT = "create table " + DB_TABLE_NAME + 
         " (_id integer primary key autoincrement, country_name text UNIQUE);)"; 

Добавлено UNIQUE вместо not null

Смежные вопросы