2016-07-31 18 views
0

Ich stehe dieses Problem, wenn ich die App 1. Mal Daten in der Datenbank einmalig laufen, aber wenn ich die App schließe und neu starten Daten geht zweimal (bedeutet zwei gleiche Zeile in der Tabelle). Ähnlich zum 3., 4. Mal und so weiter. Wie werde ich dieses Problem los? Ich stelle sogar datas.clear in DataList.java, aber nicht, ob ich die datas.clear() Zeile an der richtigen Stelle hinzugefügt habe oder nicht. PLz Hilfe, wenn es andere Probleme in meinem Code gibt.Daten wiederholen beim Neustart der App in Android Datenbank

MainActivity.java Code

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 Code

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 Code

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

Sie rufen 'uploadList();' bei jedem Start Ihrer Hauptaktivität auf. Ohne Kontrolle. Also, was hast du erwartet? Es funktioniert, wie du es gesagt hast. –

Antwort

1

diese Zeile aus Ihrem onCreate() Verfahren entfernen:

df = new DatabaseHelper(this); 

, da keine Notwendigkeit, weil Sie Objekt Ihrer DatabaseHelper Klasse innerhalb uploadList() Methode erstellen sind. Und auch Sie rufen uploadList() Methode innerhalb onCreate() das ist, warum jedes Mal, wenn Sie die App starten, die onCreate() Methode ausgeführt wird und Sie uploadList() auch ausführen. Versuchen Sie, seine aufrufende Anweisung in einem onClickListener zu platzieren, damit es passiert, wenn Sie auf eine Schaltfläche oder Ihre Auswahl klicken.