Как создать данные в базе данных только один раз - PullRequest
0 голосов
/ 04 сентября 2018

Мне нужно создать метод, который будет добавлять данные в базу данных, а затем счетчик должен отобразить их. Как я тестировал, отображение работает нормально, но я не знаю, как я могу сказать базе данных, что я хочу создать некоторые данные только один раз. Например, у меня есть таблица с именем chestExercises с тремя столбцами firstColumn, secondColumn, thirdColumn, которые имеют значения:

firstColumn = "exerciseOne"
secondColumn = "exerciseTwo"
thirdColumn = "exerciseThree"

Теперь я хочу, чтобы из программы эти данные создавались только один раз. Как я уже писал ранее, я провел несколько «тестов», и база данных постоянно создает эти данные, я не хочу иметь дубликаты. Итак ... Как я могу "сказать" базе данных, что я хочу сделать это только один раз?

База данных

 public databaseHelper(Context context) {
    super(context, DATABASE_NAME, null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("create table " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT," + COLUMN_2 + " TEXT," + COLUMN_3 + " TEXT," + COLUMN_4 + " TEXT)");

}

@Override
public void onUpgrade(SQLiteDatabase db, int i, int i1) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
    onCreate(db);
}

public boolean insertData() {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(COLUMN_2, "1");
    contentValues.put(COLUMN_3, "2");
    contentValues.put(COLUMN_4, "3");
    long result = db.insert(TABLE_NAME, null, contentValues);

    if (result == -1) {
        return false;
    } else
        return true;
}

public List<String> getAllLabels() {
    List<String> labels = new ArrayList<String>();

    String selectQuery = "SELECT  * FROM " + TABLE_NAME;

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);
    if (cursor.moveToFirst()) {
        do {
            labels.add(cursor.getString(1));
            labels.add(cursor.getString(2));
            labels.add(cursor.getString(3));
        } while (cursor.moveToNext());
    }
    cursor.close();
    db.close();

    return labels;
}

}

MainActivity

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {
Spinner spinner;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    spinner = (Spinner) findViewById(R.id.spinner);
    databaseHelper db = new databaseHelper(getApplicationContext());
    if (spinner == null){
        db.insertData();
    }else {
        Toast.makeText(MainActivity.this,
                "Your Message", Toast.LENGTH_LONG).show();
    }
    loadData();
}

public void loadData(){
    databaseHelper db = new databaseHelper(getApplicationContext());
    List<String> labels = db.getAllLabels();
    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, labels);
    dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(dataAdapter);
}

@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
    String label = adapterView.getItemAtPosition(i).toString();
    Toast.makeText(adapterView.getContext(),"Selected: "+label,Toast.LENGTH_LONG).show();
}

@Override
public void onNothingSelected(AdapterView<?> adapterView) {

}
}

1 Ответ

0 голосов
/ 04 сентября 2018

Вариант 1 - Иметь подходящее ограничение

Одним из вариантов будет определение таблицы таким образом, чтобы объединенные 3 столбца образовывали ограничение UNIQUE и, следовательно, приводили к конфликту, если объединенные столбцы существуют.

например.

db.execSQL("create table " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT," + COLUMN_2 + " TEXT," + COLUMN_3 + " TEXT," + COLUMN_4 + " TEXT, UNIQUE (" + COLUMN_2 + "," + COLUMN_3 + "," + COLUMN_4 + " ))");

В этом случае такая же комбинация значений не будет вставлена ​​(так как метод insert эффективно использует INSERT OR IGNORE, поэтому при возникновении конфликта INSERT игнорируется).

Вариант 2 - проверка количества строк в таблице

Альтернативным методом может быть проверка наличия в таблице уже данных, путем проверки количества строк.

В классе DatabaseHelper может быть метод, например: -

public boolean isTableEmpty(String tablename) {
    return DatabaseUtils.queryNumEntries(this.getWritableDatabase(),tablename) < 1;
}
  • Конечно, это можно изменить для проверки других сценариев

Вариант 3 - Запрос таблицы, чтобы увидеть, существует ли строка перед вставкой, например,

public boolean insertDataCheckingForDuplicate(String value1, String value2, String value3) {
    SQLiteDatabase db = this.getWritableDatabase();
    int rowcount = 0;

    String whereclause = COLUMN_2 + "=? AND " + COLUMN_3 + "=? AND " + COLUMN_4 + "=?";
    String[] whereargs = new String[]{value1,value2,value3};
    Cursor csr = db.query(TABLE_NAME,null,whereclause,whereargs,null,null,null);
    rowcount = csr.getCount();
    csr.close();
    if (rowcount > 0) {
        return false;
    }

    ContentValues contentValues = new ContentValues();
    contentValues.put(COLUMN_2, value1);
    contentValues.put(COLUMN_3, value2);
    contentValues.put(COLUMN_4, value3);
    long result = db.insert(TABLE_NAME, null, contentValues);

    if (result == -1) {
        return false;
    } else
        return true;
}

Вариант 4. Использование предварительно загруженной базы данных.

С помощью этого метода вы вводите предварительно загруженную базу данных (то есть база данных существует). База данных помещается в папку ресурсов и копируется из папки ресурсов в соответствующее место при первом открытии базы данных. Процесс проверяет, существует ли база данных, если она существует, то база данных открывается, а если нет, то база данных копируется.

Вы можете использовать SQLiteOpenAssethelper для упрощения этого процесса, см. android-sqlite-asset-helper . Есть также многочисленные примеры того, как сделать это самостоятельно в StackOverflow.

...