如何在表的开头正确插入行

时间:2016-02-04 14:24:24

标签: android sqlite android-sqlite

我创建了sqlite数据库并使用ContentValues从文件中插入记录,该文件包含689行,这意味着我将插入 689条记录到我创建的数据库中。

我面临的问题是,尽管我最初删除了数据库中的所有记录,但每次我调用" populate()" belwo方法发布了 接收"总行数:0"如下面的输出所示,但插入的rowid永远不会从0开始,如下面的输出所示。

换句话说,假设我将10条记录插入数据库表,最初它将包含10条记录,第一个和最后一个rowid将是1和10 分别。当我删除数据库中的所有行并插入另外10条记录时,第一行和最后一行的rowid分别为11和19 我认为,第一行和最后一行的rowid应分别为1和9

请让我知道为什么会这样,以及如何解决它

public void populate(Context context, File file, SQLiteHelper sqliteHelper) {
    this.mCtx = context;
    this.mSQLiteHelper = sqliteHelper;
    this.mSQLiteHelper.deleteALLRows();

    Log.i(TAG, "total rows: " + this.mSQLiteHelper.getTotalRowsInDB());//return 0 rows..which is understandable
    ..
    ..
    ..
    ..
    ..
try {
        while ( (line = this.mBR.readLine()) !=  null ) {
            Log.v(TAG, "line: " + line);

            params = line.split(",");

            cv.put(this.mCtx.getResources().getString(R.string.cv_col1), params[0]);
            cv.put(this.mCtx.getResources().getString(R.string.cv_col2), params[1]);
            cv.put(this.mCtx.getResources().getString(R.string.cv_col3), params[2]);
            cv.put(this.mCtx.getResources().getString(R.string.cv_col4), params[3]);

            if (!wdb.isOpen()) {
                Log.w(TAG, "wdb will be opened");
                wdb = this.mSQLiteHelper.getWritableDatabase();
            }

            rowId = wdb.insert(this.mCtx.getResources().getString(R.string.str_sqlite_table_name), null, cv);

            if (rowId != -1) {
                Log.v(TAG, "row inserted correctly. rowid: " + rowId);
            } else {
                Log.v(TAG, "row insertion error");
            }

            Log.d(TAG, "params[0]: " + params[0]);
            Log.d(TAG, "params[1]: " + params[1]);
            Log.d(TAG, "params[2]: " + params[2]);
            Log.d(TAG, "params[3]: " + params[3]);
        }

    } catch (IOException e) {
        e.printStackTrace();
    }

输出

02-04 15:07:24.182 27741-27741/com.example.com.myapplication I/Populator: total rows: 0

02-04 15:07:24.182 27741-27741/com.example.com.myapplication V/Populator: line: 163816,49.3478675,8.4643171,120
02-04 15:07:24.212 27741-27741/com.example.com.myapplication V/Populator: row inserted correctly. rowid: 1
02-04 15:07:24.212 27741-27741/com.example.com.myapplication D/Populator: params[0]: 163816
02-04 15:07:24.212 27741-27741/com.example.com.myapplication D/Populator: params[1]: 49.3478675
02-04 15:07:24.212 27741-27741/com.example.com.myapplication D/Populator: params[2]: 8.4643171
02-04 15:07:24.212 27741-27741/com.example.com.myapplication D/Populator: params[3]: 120
02-04 15:07:24.212 27741-27741/com.example.com.myapplication V/Populator: line: 163817,49.3455829,8.467746,120
02-04 15:07:24.212 27741-27741/com.example.com.myapplication V/Populator: row inserted correctly. rowid: 689
02-04 15:07:24.222 27741-27741/com.example.com.myapplication D/Populator: params[0]: 163817
02-04 15:07:24.222 27741-27741/com.example.com.myapplication D/Populator: params[1]: 49.3455829
02-04 15:07:24.222 27741-27741/com.example.com.myapplication D/Populator: params[2]: 8.467746
02-04 15:07:24.222 27741-27741/com.example.com.myapplication D/Populator: params[3]: 120
....
....
....
02-04 15:07:29.972 27741-27741/com.example.com.myapplication V/Populator: line: 456947,49.0559242,8.4985024,120
02-04 15:07:29.982 27741-27741/com.example.com.myapplication V/Populator: row inserted correctly. rowid: 690
02-04 15:07:29.982 27741-27741/com.example.com.myapplication D/Populator: params[0]: 456947
02-04 15:07:29.982 27741-27741/com.example.com.myapplication D/Populator: params[1]: 49.0559242
02-04 15:07:29.982 27741-27741/com.example.com.myapplication D/Populator: params[2]: 8.4985024
02-04 15:07:29.982 27741-27741/com.example.com.myapplication D/Populator: params[3]: 120

2 个答案:

答案 0 :(得分:1)

我在我的应用程序中做了类似的事情,当我删除所有行时,我的id从1重新启动: 我认为你不应该将id声明为autoincrement而只是主键

    public void onCreate(SQLiteDatabase db) {
    db.execSQL(
            "create table "+TABLE_NAME+ " "+
                    "(id integer primary key, name text,description text)"
            );
    }

答案 1 :(得分:-1)

第一件事是当你在一行上有一个自动增量id时,一旦它增加,即使该行被删除,它也不会自动减少。
我建议您使用 truncate table 命令代替delete命令(仅当您要删除整个表数据时) 截断的作用是丢弃你的表并重新创建它,因此你的自动增量id也将被重置,再次从0开始。 截断也比删除更快。