SQLite重复条目

时间:2013-06-15 18:07:30

标签: java android sqlite

我有以下代码,但我在复制方面遇到了一些问题。如何修改代码以便它不允许在数据库中重复?我正在使用它来为AutoCompleteTextView提供动力,因此副本没有帮助。 非常感谢!

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[] {};
    }
}
}

3 个答案:

答案 0 :(得分:1)

一种选择是在实际插入之前从removeCountry方法调用insertCountry。或者,您可以将数据库结构修改为country_name text not null unique。如果您失败了需要捕获和处理的约束,SQLite将抛出异常。

最后,另一种选择是尝试查询数据库中的相关字符串,如果存在,请不要插入,如果没有则插入。

答案 1 :(得分: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语句中调用此函数,如果条件不为真,则执行insert指令。

答案 2 :(得分: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