2017-08-24 14 views
0

SecondActivity.javaでは、次のデータをSQLiteテーブルに読み込み、後で第3パラメータ(学校/ショッピング/レストラン)に基づいて行を読み込もうとしています。私は、アプリケーションをデバッグすると、私は同じオブジェクトの複数のコピーを取得しています。ここでandroid:readingテーブルに同じオブジェクトが複数コピーされています

DatabaseHelper db = new DatabaseHelper(this); 

     // Inserting default todos 
     Log.d("Insert: ", "Inserting .."); 
     db.addtodo(new Todo(1,"Wallet", "SCHOOL")); 
     db.addtodo(new Todo(2,"Laptop", "SCHOOL")); 
     db.addtodo(new Todo(3,"Phone", "SCHOOL")); 
     db.addtodo(new Todo(4,"Laptop Charger", "SCHOOL")); 
     db.addtodo(new Todo(5,"Phone Charger", "SCHOOL")); 
     db.addtodo(new Todo(6,"USB", "SCHOOL")); 


     db.addtodo(new Todo(8,"Wallet", "SHOPPING")); 
     db.addtodo(new Todo(9,"Phone", "SHOPPING")); 
     db.addtodo(new Todo(10,"Coupons", "SHOPPING")); 
     db.addtodo(new Todo(11,"Shopping List", "SHOPPING")); 


     db.addtodo(new Todo(12,"Wallet", "RESTAURANT")); 
     db.addtodo(new Todo(13,"Phone", "RESTAURANT")); 
     db.addtodo(new Todo(14,"Gift Cards", "RESTAURANT")); 

     Log.d("Reading: ", "Reading all contacts.."); 
     ArrayList<Todo> tags_school = db.getAllTodo("SCHOOL"); 
     ArrayList<Todo> tags_restaurant = db.getAllTodo("RESTAURANT"); 
     ArrayList<Todo> tags_shopping = db.getAllTodo("SHOPPING"); 

     // Construct the data source 
     ArrayList<Todo> todolist = new ArrayList<Todo>(); 

     switch (message){ 
      case "SCHOOL":{ 
       todolist = tags_school; 
       break; 
      } 
      case "SHOPPING":{ 
       todolist = tags_shopping; 
       break; 
      } 
      case "RESTAURANT":{ 
       todolist = tags_restaurant; 
       break; 
      } 
      case "CUSTOM":{ 

       break;} 
     } 


     // Create the adapter to convert the array to views 
     TodoAdapter adapter = new TodoAdapter(this, todolist); 
     // Attach the adapter to a ListView 
     ListView listView = (ListView) findViewById(R.id.lvItems); 
     listView.setAdapter(adapter) 

} 私DatabaseHelper.java

public ArrayList<Todo> getAllTodo(String tag) { 
     ArrayList<Todo> noteList = new ArrayList<Todo>(); 
     // Select All Query 
     String selectQuery = "SELECT * FROM " + TABLE_NOTES + " WHERE " + KEY_TAG + "='"+tag+"';"; 

     SQLiteDatabase db = this.getWritableDatabase(); 
//I THINK THE QUERY IS GETTING MULTIPLE TIMES 
    Cursor cursor = db.rawQuery(selectQuery, null); 

     cursor.moveToFirst(); 
     // looping through all rows and adding to list 
     while (!cursor.isAfterLast()) { 

       Todo todo = new Todo(); 
       todo.set_id(Integer.parseInt(cursor.getString(0))); 
       todo.setNote(cursor.getString(1)); 
       todo.setTag(cursor.getString(2)); 
       // Adding contact to list 
       noteList.add(todo); 
      cursor.moveToNext(); 

     } 

     // return contact list 
     return noteList; 
    } 

にこれらがtags_schoolの内容がそうする機能です。 Here is the first pic Here is the 2nd pic 私は6つのオブジェクトだけを読みますが、121を読みます。この番号はコードを実行するたびに変わります。とても混乱するような。どこが間違っているのか分かりません。

+0

アプリを複数回実行すると、dbに同じエントリが追加されている可能性があります。アプリデータをクリアして確認します。 –

答えて

0

私はあなたの完全なコードを持っていないので、別の方法で問題を簡単に修正することをお勧めします。

Altafが言ったように、デバイスやエミュレータのアプリマネージャからアプリのデータをきれいにして、アプリを初めて実行して、取得するレコードの数を確認してください。

問題がまだ残っている場合は、onCreate/onResumeにonCreate/onResumeのデータを挿入するかどうかを確認してから、アクティビティが読み込まれるたびにデータを挿入するアクションを行わずにデータが挿入されます。

データベーステーブルにプライマリキー、ユニークキーなどの制約を追加します。無意識にデータを挿入すると、その時点でコードが失敗し、挿入するアクションを実行せずにデータをデータベースに再度挿入する原因コードが生成されます。データ。

データベーステーブルTABLE_NOTESとToDo POJOにtimeCreatedフィールドを追加することをお勧めします。これは、long型またはString型(日付が追加された時と分を持つSimpleDateFormatを使用してフォーマットされた日付)です。データの挿入時間を印刷するLog.dステートメントを追加します。プログラムを何度も実行すると、データが複数回挿入されたときと挿入されたときを識別するのに役立つデバッグデータになります。

関連する問題