java - 在添加新数据之前如何清除 SQLite 表中的所有条目?

标签 java android sqlite android-sqlite

我正在尝试清除“文章”表中的所有条目,以防止重复数据...我尝试删除该表(如果它已经存在),但这不起作用,该表没有被删除导致表中出现重复的条目......

在插入新数据之前,我尝试清除“文章”表中的所有条目...但我当前遇到的问题是表中仍然有一个条目。应有 3 个条目。

我正在尝试清空“addArticle”开头的“Articles”表。

所以我正在尝试: 1)删除Articles表中的所有条目 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();



    }

Activity

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



        }

最佳答案

删除似乎不起作用的原因是逻辑原因,而不是删除不起作用。每次调用 addArticle 方法时,都会从表中删除所有行,然后添加 1 行。因此,表中最终只会有 1 行。

一种解决方案是在添加任何文章之前删除所有行,例如:-

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

同时从 addArticle 方法中删除行删除代码。

这将类似于:-

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();
}
<小时/>

另一种方法(假设您没有更改要插入的数据)可能是仅在表为空时调用 addArticles 方法,同时删除行删除代码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);
    }

注意!您可以通过删除应用程序的数据来影响数据的更改,这是清除表的另一种方法(实际上完全删除数据库)。

<小时/>

在上面的 db.getWriteableDatabase() 中,为了简洁起见,您可能会将此类语句移动/转换为 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 约束。

你可以使用:-

@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(否则返回rowid,因为您有id INTEGER PRIMARY KEY AUTOINCRMENT,id 是 rowid 的别名)。您可能还希望按照SQLite Autoincrement 使用自动增量。而只是代码id INTEGER PRIMARY KEY

关于java - 在添加新数据之前如何清除 SQLite 表中的所有条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47440871/

相关文章:

java - 对变量 [Something] 的赋值无效

java - 创建数组的独立副本

android - 如何禁用 View 页面中的预加载?

mysql - 如何将第三个表包含到联接中,但不必担心该表是否有可以联接的行?

python - 使用Python在SQLite中插入行后如何检索插入的ID?

php - sqlite3 和 pdo_sqlite 有什么区别

java - 有没有人做过查询 REAL 数据库的 FitNesse 测试?我无法使 Fitnesse 连接成功

Java : What is Garbage Collector collecting?

android - 无法通过 Google Assistant 在媒体应用程序中开始播放

Android:如何将 <string> 元素注入(inject)到 XML 中的另一个 <string> 元素中?