2013-10-23 62 views
0

我正在创建一个简单的数据库表在android sqlite中,其中我最初插入了一些记录,但问题是,每次当我运行应用程序整个列表的记录被插入一次。例如,我已插入3个记录在我的表现在,当我运行该应用程序第一次数据库表是这样的:Android Sqlite重复插入

类别1-主题1-数据 类别2-主题2-数据 类别3-主题3 - 数据

现在,如果我不运行任何插入新记录这个应用程序,数据库表的样子: 类别1-主题1-数据 类别2-主题2-数据 类别3-专题3-数据 分类1-主题1-数据 分类2-主题2-数据 分类3-主题3-数据

我应该如何防止这种情况?请帮忙,它真的很紧迫。

这里是我的代码:

DataColumns.java:

public class DataColumns { 


String KEY_CATEGORY = "_category"; 
String KEY_TOPIC = "_topic"; 
    String KEY_DATA= "_datatoshow"; 


    public DataColumns() {} 
    // TODO Auto-generated constructor stub 

    public DataColumns(String _CAT, String _TOPIC, String _DATA) 
    { 
     this.KEY_CATEGORY = _CAT; 
     this.KEY_TOPIC= _TOPIC; 
     this.KEY_DATA = _DATA; 
    } 

    public DataColumns(String topic, String data) 
    { 

     this.KEY_TOPIC = topic; 
     this.KEY_DATA = data; 
    } 


    public String getCATEGORY() 
    { 
     return this.KEY_CATEGORY; 
    } 

    public void setCATEGORY(String _cat) 
    { 
     this.KEY_CATEGORY = _cat; 
    } 

    public String getTOPIC() 
    { 
     return this.KEY_TOPIC; 
    } 

    public void setTOPIC(String topic) 
    { 
     this.KEY_TOPIC = topic; 
    } 

    public String getDATA() 
    { 
     return this.KEY_DATA; 
    } 

    public void setDATA(String data) 
    { 
     this.KEY_TOPIC = data; 
    } 

} 

DataBaseHandler.java:

public class DataBaseHandler extends SQLiteOpenHelper { 


    public static final String KEY_CATEGORY = "_CATEGORY"; 
    public static final String KEY_TOPIC = "_TOPIC"; 
    public static final String KEY_DATA = "_DATA"; 

    public static final String SQLITE_TABLE = "DB_TABLE"; 


     private static final String DATABASE_NAME = "WMCPROJECT.db"; 
     private static final int DATABASE_VERSION = 1; 

    public DataBaseHandler(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     // TODO Auto-generated constructor stub 
    } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      // TODO Auto-generated method stub 

      db.execSQL("CREATE TABLE " + SQLITE_TABLE + "(" + _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_CATEGORY + " TEXT NOT NULL, " + KEY_TOPIC + " TEXT NOT NULL," + KEY_DATA + " TEXT NOT NULL);"); 
      Log.d("db", "DATABASE CREATION"); 

     } 
     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      // TODO Auto-generated method stub 

      // Drop older table if existed 
      db.execSQL("DROP TABLE IF EXISTS " + SQLITE_TABLE); 

      // Create tables again 
      onCreate(db); 

     } 


    void addRecord(DataColumns col_values) 
     { 
     SQLiteDatabase db = this.getWritableDatabase(); 

      ContentValues values = new ContentValues(); 

      values.put(KEY_CATEGORY,col_values.getCATEGORY()); 
      values.put(KEY_TOPIC, col_values.getTOPIC()); 
      values.put(KEY_DATA, col_values.getDATA()); 
      // Inserting Row 
      db.insertOrThrow(SQLITE_TABLE, null, values); 
      db.close(); // Closing database connection 


     } 

} 

MainActivity.java:

public class MainActivity extends Activity { 

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

DataBaseHandler dbhandler = new DataBaseHandler(this); 

dbhandler.addRecord(new DataColumns("CAT1","TOPIC 1","data to show"); 
dbhandler.addRecord(new DataColumns("CAT2","TOPIC 2","data to show"); 
dbhandler.addRecord(new DataColumns("CAT3","TOPIC 3","data to show"); 



    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 

} 

回答

0

简单,而不是调用的addRecord在onCreate方法,你可以调用它在onCreate方法中的数据库处理器类是这样的:

 @Override 
     public void onCreate(SQLiteDatabase db) { 
      // TODO Auto-generated method stub 

      db.execSQL("CREATE TABLE " + SQLITE_TABLE + "(" + _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_CATEGORY + " TEXT NOT NULL, " + KEY_TOPIC + " TEXT NOT NULL," + KEY_DATA + " TEXT NOT NULL);"); 
      Log.d("db", "DATABASE CREATION"); 
      addRecord(new DataColumns("CAT1","TOPIC 1","data to show"); 
      addRecord(new DataColumns("CAT2","TOPIC 2","data to show"); 
      addRecord(new DataColumns("CAT3","TOPIC 3","data to show"); 
     } 

在SQLiteOpenHelper的onCreate方法仅适用于第一次数据库制作运行。

+0

这是不可能的,因为SQLiteOpenHelper只运行一次这种方法。您应该在您的活动中删除onCreate中的addrecord行。 –

+0

我的活动是这样的:公共类MainActivity扩展活动{ \t @覆盖 \t保护无效的onCreate(捆绑savedInstanceState){ \t \t super.onCreate(savedInstanceState); \t \t setContentView(R.layout.activity_main); \t \t DataBaseHandler dbhandler = new DataBaseHandler(this); \t}但现在数据库没有被创建。 – user2011302

+1

@ user2011302您应该调用getWritableDatabase方法来物理创建新的数据库。所以数据库处理器类内部创建一个方法这样'\t公共无效打开()抛出的SQLException { \t \t this.getWritableDatabase(); \t} ' –

3

尝试这样的事情......

void addRecord(DataColumns col_values) 
     { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     ContentValues values = new ContentValues(); 
     values.put(KEY_CATEGORY,col_values.getCATEGORY()); 
     values.put(KEY_TOPIC, col_values.getTOPIC()); 
     values.put(KEY_DATA, col_values.getDATA()); 

       String sqlQuery = "SELECT * FROM " + TABLENAME + " WHERE " + KEY_CATEGORY + " = " + "\"" 
         + col_values.getCATEGORY() + "\""; 

       Cursor c = db.rawQuery(sqlQuery, null); 
       if (c != null && c.getCount() != 0) { 

       } else { 
        db.insert(TABLENAME, null, values); 
       } 
    } 
+0

它以最初插入记录的方式工作,现在每次运行应用程序时,以前的记录都不会再次插入。但在这里,问题是当我运行一些新的记录的应用程序,现在这些新的reocrds没有被插入,因为它发现“if条件”为真。 – user2011302

+0

通过在create table命令中为列KEY_DATA添加UNIQUE约束可以解决问题。 – user2011302

0

我已经测试你的项目,我注意到一个问题。你必须使用DataBaseHandler类的onCreate中的db参数来第一次添加。 在数据库处理器的onCreate方法改成这样:

@Override 
public void onCreate(SQLiteDatabase db) { 
    // TODO Auto-generated method stub 

    db.execSQL("CREATE TABLE " + SQLITE_TABLE 
      + "(_id INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_CATEGORY 
      + " TEXT NOT NULL, " + KEY_TOPIC + " TEXT NOT NULL," + KEY_DATA 
      + " TEXT NOT NULL);"); 
    Log.d("db", "DATABASE CREATION"); 
    ContentValues cv = new ContentValues(); 
    cv.put(KEY_CATEGORY, "CAT1"); 
    cv.put(KEY_TOPIC, "TOPIC 1"); 
    cv.put(KEY_DATA, "data to show"); 
    db.insert(SQLITE_TABLE, null, cv); 

    cv = new ContentValues(); 
    cv.put(KEY_CATEGORY, "CAT2"); 
    cv.put(KEY_TOPIC, "TOPIC 2"); 
    cv.put(KEY_DATA, "data to show"); 
    db.insert(SQLITE_TABLE, null, cv); 

    cv = new ContentValues(); 
    cv.put(KEY_CATEGORY, "CAT3"); 
    cv.put(KEY_TOPIC, "TOPIC 3"); 
    cv.put(KEY_DATA, "data to show"); 
    db.insert(SQLITE_TABLE, null, cv); 

} 

我已经测试过它,它工作正常。