2016-07-31 13 views
0

私はアプリを実行するたびにこの問題に直面しています。データベースの1回目のデータは1回だけですが、アプリケーションを終了して再びデータを再開すると2回表示されます。同様に、3回目、4回目など。どうすればこの問題を取り除くことができますか? DataList.javaにdatas.clearを入れても、正しい場所にdatas.clear()行を追加したかどうかは関係ありません。 PLZは私のコードに他の問題がある場合に助けます。Androidデータベースでアプリケーションを再起動するとデータが繰り返される

MainActivity.javaコード

public class MainActivity extends AppCompatActivity { 

Button listButton, addButton; 
DatabaseHelper df; 
private final static String TAG = "TestActivity"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    df = new DatabaseHelper(this); 

    addButton = (Button) findViewById(R.id.addbutton); 
    uploadList(); 
} 

public void uploadList(){ 
     DatabaseHelper df=new DatabaseHelper(this); 
      df.open(); 
      try{ 
       InputStream im=getResources().getAssets().open("testdata.csv"); 
       BufferedReader br=new BufferedReader(new InputStreamReader(im)); 
       String data=br.readLine(); 
       while(data != null){ 
        String t[]=data.split(","); 
        Product p=new Product(); 
        p.setFirst(t[0]); 
        p.setSec(t[1]); 
        p.setThird(t[2]); 
        df.insert(p); 
        data=br.readLine(); 
       } 
      }catch(Exception e){ 

      } 

} 
} 

DatabaseHelper.javaコード

public class DatabaseHelper extends SQLiteOpenHelper{ 

private static final String FIRST="Name"; 
private static final String SECOND="Issn"; 
private static final String THIRD="ImpactFactor"; 

private static final String DATABASE="journal2016"; 
private static final String TABLENAME="journal"; 

private static final int VERSION=1; 

SQLiteDatabase sd; 

public void open(){ 
    sd=getWritableDatabase(); 
} 
public void close(){ 
    sd.close(); 
} 

public DatabaseHelper(Context context) { 
    super(context, DATABASE, null, VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase sqLiteDatabase) { 
    sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + TABLENAME); 
    sqLiteDatabase.execSQL("CREATE TABLE " + TABLENAME + " (NAME TEXT, ISSN TEXT, IMPACTFACTOR REAL)"); 
} 

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



public long insert(Product p){ 
    ContentValues cv=new ContentValues(); 
    cv.put(FIRST, p.getFirst()); 
    cv.put(SECOND, p.getSec()); 
    cv.put(THIRD, p.getThird()); 
    return sd.insertWithOnConflict(TABLENAME, null, cv,SQLiteDatabase.CONFLICT_REPLACE); 

} 

public List<Product> getAllProduct(){ 
    ArrayList<Product> list=new ArrayList<Product>(); 
    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor c=db.rawQuery("SELECT * FROM " + TABLENAME, null); 
    while(c.moveToNext()){ 
     Product p=new Product(); 
     p.setFirst(c.getString(0)); 
     p.setSec(c.getString(1)); 
     p.setThird(c.getString(2)); 
     list.add(p); 
    } 
    db.close(); 
    return list; 
} 
} 

DataList.javaコード

public class DataList extends Activity{ 

List<Product> datas = new ArrayList<Product>(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.list); 
    datas.clear(); 
    DatabaseHelper d=new DatabaseHelper(this); 
    d.open(); 
    datas = d.getAllProduct(); 
    ListView lv=(ListView)findViewById(R.id.listView1); 
    lv.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, datas)); 
} 

} 

Product.java

public class Product { 
private String first; 
private String second; 
private String third; 
public String getFirst() { 
    return first; 
} 
public void setFirst(String first) { 
    this.first = first; 
} 
public String getSec() { 
    return second; 
} 
public void setSec(String sec) { 
    this.second = sec; 
} 
public String getThird() { 
    return third; 
} 
public void setThird(String third) { 
    this.third = third; 
} 

@Override 
public String toString() { 

    return first + second + third; 
} 

} 
+0

あなたのメインアクティビティが始まるたびに、あなたは 'uploadList();'を呼び出しています。制御なしに。それで、あなたは何を期待しましたか?あなたが言ったように働いています。 –

答えて

1

あなたonCreate()方法からこの行を削除します。あなたはuploadList()メソッド内でごDatabaseHelperクラスのオブジェクトを作成しているので、それを不要として

df = new DatabaseHelper(this); 

。 また、onCreate()の中にuploadList()メソッドを呼び出すと、アプリを起動するたびにonCreate()メソッドが実行され、uploadList()も実行されます。 onClickListenerに呼び出しステートメントを入れて、ボタンや選択したものをクリックすると発生します。

関連する問題