Проблема дублирования данных Android sqlite

Я создаю приложение, в котором люди дают оценки другим людям. Для этого я хочу вставить имена некоторых людей (скажем, 5) в базу данных во время установки приложения. Теперь, когда я запускаю приложение в первый раз, все идет нормально. Но когда я запускаю его во второй раз, данные снова вставляются, делая их 10, т.е. повторяющиеся данные. Проблема в том, что всякий раз, когда я запускаю это действие, оно добавляет данные. Каково решение этой проблемы? Вот мой код:

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
     public class GamePlay extends ActionBarActivity {
     //Some code-----------

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.gameplay);
    //Some code----

    db=openOrCreateDatabase("MyGameData", MODE_PRIVATE, null);

    try{
        db.execSQL("create table teachers(_id integer primary key autoincrement , name varchar(30) , gender varchar(2) , score integer)");
        Toast.makeText(this, "Table created", Toast.LENGTH_SHORT).show();
    }

    catch(Exception e){
        Toast.makeText(this, "Exception 1", Toast.LENGTH_SHORT).show();
        Log.i("Create table", e.getMessage());
    }

    // Insert values in table-------


    String str_name[]={"arun", "dhanraj", "decoder", "sanjana"};
    String str_gender[]={"m", "m", "m", "f"};

    ContentValues cv = new ContentValues();

    for(int i=0; i<str_name.length; i++){

        cv.put("name", str_name[i]);
        cv.put("gender", str_gender[i]);
        db.insert("teachers", null, cv);

    }

   //Some code------

person Decoder    schedule 02.12.2014    source источник
comment
Для уверенности. Вам следует ОБНОВИТЬ существующие данные, если они уже есть. Вы только ВСТАВЛЯЕТЕ новые записи, дублируя информацию в своей БД.   -  person Phantômaxx    schedule 03.12.2014
comment
@DerGolem: я хочу вставить новые данные во время установки. Сначала нет данных. Вот почему я использую INSERT. Обновление — это другой процесс. Итак, как мне вставить имена и пол?   -  person Decoder    schedule 03.12.2014
comment
Я бы сделал еще один запрос, чтобы узнать, существует ли пользователь, затем сделал бы то, что говорит Дер Голем, и обновил бы данные.   -  person Kristy Welsh    schedule 03.12.2014
comment
Вы можете обойтись без другого запроса и всегда использовать команду REPLACE INTO (хотя и медленнее, потому что она всегда проверяет, существуют ли данные и решает, выполнять ли INSERTion или UPDATE). Но это концепция. Вы также можете попробовать выполнить ОБНОВЛЕНИЕ и устранить возвращенную ошибку, на этот раз выполнив ОБНОВЛЕНИЕ.   -  person Phantômaxx    schedule 03.12.2014
comment
@KristyWelsh: Да, это решение. Но выполнение запроса было бы долгим процессом, если, скажем, мне нужно вставить 100 имен и полов. Это заняло бы ненужное время. Я хочу вставить данные только один раз, и они не должны вставляться при следующем запуске. Работа по обновлению идет отдельно. У меня нет проблем с этим. Есть ли другой метод, который можно использовать?   -  person Decoder    schedule 03.12.2014
comment
@DerGolem: я думаю, вы не понимаете, что я пытаюсь сделать. Позвольте мне быть ясным. Я создаю приложение, чтобы люди могли ставить оценки некоторым конкретным именам. Поэтому я хочу вставлять имена во время установки только ОДИН РАЗ. Теперь, после того, как имена даны, я хочу, чтобы при запуске приложения во второй раз оно НЕ должно было снова вводить имена. Оценки будут обновлены. Я сделал эту часть. Да, проверка OR REPLACE INTO — это решение, но это замедлит работу приложения, если нет. количество имен увеличилось, скажем, на 100. Так какое же решение?   -  person Decoder    schedule 03.12.2014
comment
Я прекрасно понял. Решение, как указано другими, заключается в том, чтобы включить ваши INSERT в событие onCreate вашего класса DBHelper. Затем выполняйте только ОБНОВЛЕНИЯ.   -  person Phantômaxx    schedule 03.12.2014
comment
@DerGolem: теперь ты понял. Спасибо, в любом случае.   -  person Decoder    schedule 05.12.2014


Ответы (2)


У вас должен быть класс SQLiteOpenHelper, который содержит некоторые методы для управления базой данных и жизненного цикла, такие как

onCreate(SQLiteDatabase db) // Called when the database is created for the first time.
onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) //Called when the database needs to be downgraded.
onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) // Called when the database needs to be upgraded.

И другие, вы можете посмотреть здесь: http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html

Следование этому руководству поможет вам правильно использовать этот помощник: http://developer.android.com/training/basics/data-storage/databases.html

Мой совет - создать несколько запросов, подобных тем, которые будут заполняться и выполняться после создания таблиц, которые также должны быть там. Таким образом, ваше приложение будет делать эти вставки только в первый раз и сохранять их, даже если вы обновите свою базу данных (если вы не укажете что-то еще в методе onUpgrade()).

Это должно решить вашу проблему.

person axierjhtjz    schedule 03.12.2014
comment
Да, это решило проблему. Спасибо. - person Decoder; 03.12.2014

Если я правильно понял вашу проблему, вы можете использовать вспомогательный класс и расширить SQLiteOpenHelper.

В методе onCreate вы можете вставить необходимые данные. Этот метод вызывается только один раз.

Надеюсь это поможет.

person Hanelore Ianoseck    schedule 02.12.2014