2017-11-22 9 views
0

重複したデータを防ぐために 'Articles'テーブルからすべてのエントリをクリアしようとしています...既に存在する場合はテーブルを削除しようとしましたが、うまくいかず、テーブルが削除されませんでした.....新しいデータを追加する前にSQLiteテーブルからすべてのエントリをクリアするには?

私は新しいデータを挿入する前に 'Articles'テーブルからすべてのエントリをクリアしようとしました...しかし、私は現在、テーブルのエントリ。 3つのエントリが必要です。

私は '記事'テーブルを 'addArticle'の先頭で空にしようとしています。

だから私はしようとしている: 1)記事の表 2内のすべてのエントリを削除します)記事テーブル

に新しいエントリを追加するには、下記のコードください:

public class SQLiteDatabaseHandler extends SQLiteOpenHelper { 

    private static final int DATABASE_VERSION = 1; 
    private static final String DATABASE_NAME = "mytubeDb"; 
    private static final String TABLE_NAME = "Articles"; 
    private static final String KEY_ID = "id"; 
    private static final String KEY_TITLE = "title"; 
    private static final String KEY_DESCRIPTION = "description"; 
    private static final String KEY_URL= "url"; 
    private static final String[] COLUMNS = { KEY_ID, KEY_TITLE, KEY_DESCRIPTION, 
      KEY_URL }; 

    public SQLiteDatabaseHandler(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 

     String CREATION_TABLE = "CREATE TABLE "+ TABLE_NAME +" (" 
       + "id INTEGER PRIMARY KEY AUTOINCREMENT, " + "title TEXT, " 
       + "description TEXT, " + "url TEXT)"; 
     db.execSQL(CREATION_TABLE); 


    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // you can implement here migration process 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); 
     this.onCreate(db); 
    } 



    public Article getArticle(int id) { 
     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor cursor = db.query(TABLE_NAME, // a. table 
       COLUMNS, // b. column names 
       " id = ?", // c. selections 
       new String[] { String.valueOf(id) }, // d. selections args 
       null, // e. group by 
       null, // f. having 
       null, // g. order by 
       null); // h. limit 

     if (cursor != null) 
      cursor.moveToFirst(); 


      Article article = new Article(); 
      article.setId(Integer.parseInt(cursor.getString(0))); 
      article.setTitle(cursor.getString(1)); 
      article.setDescription(cursor.getString(2)); 
      article.setUrl(cursor.getString(3)); 

      return article; 

    } 

    public List<Article> allArticles() { 

     List<Article> articles = new LinkedList<Article>(); 
     String query = "SELECT * FROM " + TABLE_NAME; 
     SQLiteDatabase db = this.getWritableDatabase(); 
     Cursor cursor = db.rawQuery(query, null); 
     Article article = null; 

     if (cursor.moveToFirst()) { 
      do { 
       article = new Article(); 
       article.setId(Integer.parseInt(cursor.getString(0))); 
       article.setTitle(cursor.getString(1)); 
       article.setDescription(cursor.getString(2)); 
       article.setUrl(cursor.getString(3)); 
       articles.add(article); 
      } while (cursor.moveToNext()); 
     } 

     return articles; 
    } 

    public void addArticle(Article article) { 
     SQLiteDatabase db = this.getWritableDatabase(); 

     ///// TRYING TO CLEAR ALL RECORDS BEFORE ENTERING NEW ONES 
     String Delete = "DELETE FROM " + TABLE_NAME; 
     db.execSQL(Delete); 


     values.put(KEY_TITLE, article.getTitle()); 
     values.put(KEY_DESCRIPTION, article.getDescription()); 
     values.put(KEY_URL, article.getUrl()); 
     // insert 
     db.insert(TABLE_NAME,null, values); 
     db.close(); 
    } ContentValues values = new ContentValues(); 



    } 

活動を

private SQLiteDatabaseHandler db; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_journey_entertainment); 


     db = new SQLiteDatabaseHandler(this); 
     // create some players 
     Article article1 = new Article(1, "THIS IS NEWS", "NEWS DESCRIPTION", "url1"); 
     Article article2 = new Article(2, "THIS IS MORE NEWS", "NEWS DESCRIPTION1", "url2"); 
     Article article3 = new Article(3, "EVEN MORE NEWS", "DESCRIPTION3", "url3"); 
     // add them 
     db.addArticle(article1); 
     db.addArticle(article2); 
     db.addArticle(article3); 


     // list all ARTICLES 
     List<Article> articles = db.allArticles(); 

     if (articles != null) { 
      String[] itemsTitle = new String[articles.size()]; 

      for (int i = 0; i < articles.size(); i++) { 
       itemsTitle[i] = articles.get(i).toString(); 
      } 

      // display like string instances 
      ListView list = (ListView) findViewById(R.id.list); 
      list.setAdapter(new ArrayAdapter<String>(this, 
        android.R.layout.simple_list_item_1, android.R.id.text1, itemsTitle)); 



     } 
+0

"動作しませんでした..."それぞれの試行された解決策で何が起こったのかを詳しく説明してください。 –

+0

@ Code-Apprentice ..更なる詳細で質問を更新してください。 –

+0

sqliteクラスを呼び出すときにコードを入力 – diegoveloper

答えて

1

DELETEが機能していないように見える理由は、DELETEが機能していないのに対し、ロジックによるものです。 addArticleメソッドを呼び出す/呼び出すたびにテーブルからすべての行を削除し、1行追加します。あなたはテーブルの中で1行だけで終わるでしょう。

解決策の1つは、記事を追加する前にすべての行を削除することです。 - 行がaddArticleメソッドからコードを削除する削除するとともに

db = new SQLiteDatabaseHandler(this); 
    // delete all rows 
    db.getWriteableDatabase().delete("Articles",null,null); //<<<<<<<< 
    // create some players 
    Article article1 = new Article(1, "THIS IS NEWS", "NEWS DESCRIPTION", "url1"); 
    Article article2 = new Article(2, "THIS IS MORE NEWS", "NEWS DESCRIPTION1", "url2"); 
    Article article3 = new Article(3, "EVEN MORE NEWS", "DESCRIPTION3", "url3"); 
    // add them 
    db.addArticle(article1); 
    db.addArticle(article2); 
    db.addArticle(article3); 

。 (あなたが挿入されるようにデータを変更していないと仮定して)別のアプローチは、ときにのみaddArticlesメソッドを呼び出すには可能性があり

public void addArticle(Article article) { 
    SQLiteDatabase db = this.getWritableDatabase(); 

    values.put(KEY_TITLE, article.getTitle()); 
    values.put(KEY_DESCRIPTION, article.getDescription()); 
    values.put(KEY_URL, article.getUrl()); 
    // insert 
    db.insert(TABLE_NAME,null, values); 
    db.close(); 
} 

- :その後、ようなものになるだろう

テーブルが空であり、再度、行削除コードをaddArticleメソッドから削除する

-

db = new SQLiteDatabaseHandler(this); 
    Article article1 = new Article(1, "THIS IS NEWS", "NEWS DESCRIPTION", "url1"); 
    Article article2 = new Article(2, "THIS IS MORE NEWS", "NEWS DESCRIPTION1", "url2"); 
    Article article3 = new Article(3, "EVEN MORE NEWS", "DESCRIPTION3", "url3"); 
    if (DatabaseUtils.queryNumEntries(db.getWriteableDatabase(),"Articles") < 1) { 
     // add them 
     db.addArticle(article1); 
     db.addArticle(article2); 
     db.addArticle(article3); 
    } 

メモ: Appのデータを削除することで、データの変更に影響を与える可能性があります。これは、テーブルを消去するもう1つの方法です(実際にはデータベース全体を削除します)。上記db.getWriteableDatabase()


breviityのために使用されてきた、あなたはおそらくSQLiteDatabaseHandler

例えば内のメソッドに、このような文を変換/移動しますあなたが持っているかもしれません: -

public void deleteAllAtricles() { 
     SQLiteDatabase db = this.getWriteableDatabase(); 
     db.delete(TABLE_NAME,null,null); 
     db.close(); 
    } 

    public long getArticleCount() { 
     long rv; 
     SQLiteDatabase db = this.getWriteableDatabase(); 
     rv = DatabaseUtils.queryNumEntries(db,TABLE_NAME); 
     db.close(); 
     return rv; 
    } 

あなたの最終目標は、常に重複があなたがUNIQUE制約を追加することができ、その後の記事のために、URLの言うことを防止することである場合。

あなたが使用することができる: -

@Override 
public void onCreate(SQLiteDatabase db) { 

    String CREATION_TABLE = "CREATE TABLE "+ TABLE_NAME +" (" 
      + "id INTEGER PRIMARY KEY AUTOINCREMENT, " + "title TEXT, " 
      + "description TEXT, " + "url TEXT UNIQUE)"; 
    db.execSQL(CREATION_TABLE); 
} 

又は

@Override 
public void onCreate(SQLiteDatabase db) { 

    String CREATION_TABLE = "CREATE TABLE "+ TABLE_NAME +" (" 
      + "id INTEGER PRIMARY KEY AUTOINCREMENT, " + "title TEXT, " 
      + "description TEXT, " + "url TEXT, UNIQUE(url)) "; 
    db.execSQL(CREATION_TABLE); 
} 

微妙な違いは、後者がテーブルに制約を定義しながら、前者に一意性制約が、カラム内で定義されていることですレベル(これにはどの列を伝える必要があるか)。

重複がある場合、db.insert(TABLE_NAME,null, values);は-1をlongとして返します(そうでない場合は、id INTEGER PRIMARY KEY AUTOINCREMENTのようにROWIDが返されます)。idはROWIDのエイリアスです。 SQLite AutoincrementのようにAUTOINCREMENTを使用し、その代わりにコードid INTEGER PRIMARY KEYを実行することもできます。

関連する問題