2016-07-31 158 views
0

每當我運行應用程序時,我都面臨這個問題數據庫中的第一次數據保持單一時間,但是當我關閉應用程序並重新啓動時,數據會再次兩次(表示表中兩個相同的行)。第3次,第4次也是如此。我如何擺脫這個問題?我甚至把datas.clear放在DataList.java中,但不要將數據.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; 
} 

} 
因爲你是裏面創建 uploadList()方法您 DatabaseHelper類的對象

df = new DatabaseHelper(this); 

,因爲沒有必要的是:從你的onCreate()方法

+0

您每次開始主要活動時都會調用'uploadList();'。沒有任何控制。那麼,你期望什麼?它按照你的要求工作。 –

回答

1

刪除此行。 而且你在onCreate()裏面調用uploadList()方法,這就是爲什麼每次啓動應用程序時,onCreate()方法都會執行,而uploadList()也會執行。嘗試將其調用語句放入onClickListener中,以便在單擊按鈕或選擇東西時發生。

相關問題