Повторяющееся значение в базе данных SQLite в Android - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь использовать SQLite в своем приложении для Android.Я беру файл CSV, читаю это и записываю запись во внутреннюю БД.Нет проблем.Но когда я читаю значение, при первом запуске число значения будет правильным, если я закрою и снова открою приложение, я обнаружил двойное или тройное значение.

В своем запросе я использую 'CREATE IF NOT EXISTS' но результат тот же.

Это моя 'DatabaseHelper' любая идея по решению проблемы?

public class DatabaseHelper extends SQLiteOpenHelper {
public DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(MusicInfoSQL.CREATE_TABLE);
    db.execSQL(PeopleInfoSQL.CREATE_TABLE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}


public Cursor getAllDataFromTable(String tableName) {
    SQLiteDatabase db = this.getWritableDatabase();

    if (tableName.equals(MusicInfoSQL.TABLE_NAME)
            || tableName.equals(PeopleInfoSQL.TABLE_NAME)) {
        return db.rawQuery(" SELECT * FROM " + tableName, null);
    }
    return null;
}

}

Это метод записи:

public boolean insertTrack(MusicInfoSQL music) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(MusicInfoSQL.COLUMN_ID, music.getId());
    contentValues.put(MusicInfoSQL.COLUMN_NAME, music.getName());
    contentValues.put(MusicInfoSQL.COLUMN_AUTHOR, music.getAuthor());
    long result = db.insertWithOnConflict(MusicInfoSQL.TABLE_NAME, null, contentValues, SQLiteDatabase.CONFLICT_REPLACE);
    if (result == -1) {
        return false;
    } else {
        return true;
    }
}

В любой деятельности, где я использую DB :

DatabaseHelper mDB = new DatabaseHelper(this);

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Попробуйте это

Во избежание дублирования данных используйте следующий код вместо SQLiteDatabase db.insert (...)

 db.insertWithOnConflict(TABLE_NAME, null, contentValues, SQLiteDatabase.CONFLICT_REPLACE);

вставьте это в ваш код записи

Обновление

Например, мой код записи ДБ

  public void addInformations(SQLiteDatabase db, String id, String title, String cname, String image, String caddres, String clocation, String logo,String phone,String count, String valid) {

    ContentValues contentValues = new ContentValues();

    contentValues.put(ProductEntry.ID, id);
    contentValues.put(ProductEntry.TITLE, title);
    contentValues.put(ProductEntry.NAME, name);
    contentValues.put(ProductEntry.IMAGE, image);

    db.insertWithOnConflict(ProductEntry.TABLE_NAME, null, contentValues, SQLiteDatabase.CONFLICT_REPLACE);

}

и в вашем

 db.execSQL(MusicInfoSQL.CREATE_TABLE);
db.execSQL(PeopleInfoSQL.CREATE_TABLE);

установить первичный ключ следующим образом

   private static final String CREATE_TABLE= "create table " + ProductEntry.TABLE_NAME + "(" + ProductEntry.ID + " text PRIMARY KEY," ........
0 голосов
/ 23 января 2019

Чтобы избежать подобных проблем с параллелизмом, базу данных следует открывать только один раз.

Использовать шаблон синглтона .

См. Также DataBaseHelper, Singleton или нет?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...