带有插入行的Android SQLite数据库

时间:2016-03-11 10:44:38

标签: android mysql database sqlite

我正在尝试在数据库中创建一个带有一些预插入行的应用程序供用户使用。我在这里看到了很多关于同一主题的不同问题,但我仍然有些困惑。

目前我有一个DB类,它包含所有表创建和与不同表交互的函数。根据我对阅读有关预填充数据的最佳方法的理解是在assets文件夹中创建一个文件并调用它来插入数据。

根据以下答案的帮助,我取得了一些进展,我没有遇到无法访问res文件夹或甚至原始文件夹中的sql文件的错误。我在下面添加了该类的片段,我正在创建我的表,然后尝试使用runScript方法调用sql文件。我还添加了res和raw的目录布局。

方法

public void runScript(SQLiteDatabase db, int rawResourceId, boolean okToFail)
{
    Log.i("DB", "Running SQL script");
    InputStream in = context.getResources().openRawResource(rawResourceId);
    Scanner s = new Scanner(in);
    String sql = "";
    while (s.hasNext())
    {
        sql += " " + s.nextLine();
        if (sql.endsWith(";"))
        {
            try
            {
                db.execSQL(sql);
            }
            catch (SQLException e)
            {
                if (okToFail)
                    Log.w(getClass().getSimpleName(), e.getMessage());
                else
                    throw e;
            }
            sql = "";
        }
    }
    s.close();
}




private static class DatabaseHelper extends SQLiteOpenHelper
{
    DatabaseHelper(Context context)
    {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db)
    {
        try {
            db.execSQL(CREATE_TABLE_RECIPES);
            db.execSQL(CREATE_TABLE_INGREDIENTS);
            db.execSQL(CREATE_TABLE_CONTENTS);
            db.execSQL(CREATE_TABLE_SHOPPING);
            db.execSQL(CREATE_TABLE_DIRECTIONS);
            db.execSQL(CREATE_TABLE_FOOD_CATEGORY);
            db.execSQL(CREATE_TABLE_FOOD_LIST);
            db.execSQL(CREATE_TABLE_BARCODE);
            db.execSQL(CREATE_TABLE_FAVOURITES);

            runScript(db, R.raw.pocket_chef_db.sql); ------Cannot resolve symbol raw
            //runScript(db, R.res.database.pocket_chef_db.sql) ------Cannot resolve symbol res


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

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    {
        Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                + newVersion + ", which will destroy all old data");
        db.execSQL("DROP TABLE IF EXISTS contacts");
        onCreate(db);
    }
}

Res - sql的路径

Res->database->pocket_chef_db.sql

Raw - sql的路径

Raw->pocket_chef_db.sql

2 个答案:

答案 0 :(得分:1)

我这样做的方法是创建一个.sql文件并将其放在res / raw文件夹中。

此脚本包含rtc-everywhere语句以删除所有现有表,然后执行所有DROP IF EXISTS语句。如果您当然可以添加CREATE TABLE语句。

要运行此脚本,我在SQLOpenLiteHelper扩展类中编写了以下方法。如果您的文件名为db_create.sql,则rawResourceId将为INSERT

R.raw.db_create

答案 1 :(得分:0)

尝试使用此链接https://github.com/jgilfelt/android-sqlite-asset-helper中的SqliteAssetHelper来实现您的要求。