【问题标题】:Data repeating on restarting App in Android Database在Android数据库中重新启动应用程序的数据重复
【发布时间】:2016-07-31 15:05:30
【问题描述】:

每当我第一次运行应用程序时,我都会遇到这个问题,数据库中的数据保持单次,但是当我关闭应用程序并再次重新启动时,数据会出现两次(意味着表中的两个相同行)。同样适用于第 3 次、第 4 次等等上。我该如何摆脱这个问题?我什至将 datas.clear 放在 DataList.java 中,但不知道我是否在正确的位置添加了 datas.clear() 行。 如果我的代码中还有任何其他问题,请 PLz 帮助。

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));
}

}

产品.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();。没有任何控制。那么,你期待什么?它按你说的那样工作。

标签: android sqlite android-database


【解决方案1】:

从您的 onCreate() 方法中删除此行:

df = new DatabaseHelper(this);

不需要它,因为您是在 uploadList() 方法中创建 DatabaseHelper 类的对象。 而且您还在onCreate() 中调用uploadList() 方法,这就是为什么每次启动应用程序时,onCreate() 方法都会执行,而您uploadList() 也会执行。尝试将其调用语句放在 onClickListener 中,以便在您单击按钮或您选择的内容时发生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 2019-10-27
    • 2018-07-06
    • 1970-01-01
    • 2012-04-02
    相关资源
    最近更新 更多