【问题标题】:Android Pre-Populated Database [duplicate]Android预填充数据库[重复]
【发布时间】:2011-01-25 10:22:30
【问题描述】:

我正在开发一个 Android 应用程序,该应用程序需要在该应用程序的数据库中填充多个条目(一个表,包含 1000-10000 行),然后用户才能使用该应用程序。我查看了一些教程,但不确定最好的方法。我是否应该在每次启动应用程序时检查数据库是否存在,如果不存在,创建它并插入我需要的数千条记录?或者有没有更好的方法来处理这个问题?理想情况下,它可以作为应用程序安装过程的一部分包含在内,但我不确定这是否可行。任何反馈将不胜感激。

【问题讨论】:

  • 我不想将此作为答案发布,因为它不是真的。考虑编写 Java 来构建数据库在 Android 上(例如,从使用 ADB 推送的 CSV 文件)。然后压缩到/assets进行安装。尝试完全匹配 Android 在非 Android 环境中的期望结果对我来说是一个脆弱的构建步骤。
  • @JonDiY212 链接中的 HTML 错误。

标签: database android


【解决方案1】:

这是一个如何创建和填充数据库的示例,您可以在应用安装时执行此操作,但这只会创建一个条目,但对于您想要执行的操作可能效率低下。

private static class settingsDatabaseHelper extends SQLiteOpenHelper{

    //SQL String for creating the table required
    private static final String CREATE_SETTINGS_TABLE
    = "CREATE TABLE tbl_settings(" +
            "_ID INTEGER PRIMARY KEY AUTOINCREMENT," +
            "VOIPUSERNAME TEXT," +
            "VOIPAUTHID TEXT," +
            "PASSWORD TEXT," +
            "VOIPDISPLAYNAME TEXT," +
            "SIPPROXYSERVER TEXT," +
            "SIPREGISTRAR TEXT," +
            "SIPREALM TEXT," +
            "EXPIRESTIME INTEGER);";    

    //constructor
    public settingsDatabaseHelper(Context context, String name,
            CursorFactory factory, int version) {
        super(context, name, factory, version);

    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_SETTINGS_TABLE);
         ContentValues initialValues = new ContentValues();
            initialValues.put("VOIPUSERNAME", "xxxxx");
            initialValues.put("VOIPAUTHID", "xxxxxxxxxx");
            initialValues.put("PASSWORD", "xxxxxx");
            initialValues.put("VOIPDISPLAYNAME", "xxxxxxxxx");
            initialValues.put("SIPPROXYSERVER", "xxxxxxxxxxxxx");
            initialValues.put("SIPREGISTRAR", "xxxxxxxxxxx");
            initialValues.put("SIPREALM", "xxxxxxxxxx");
            initialValues.put("EXPIRESTIME", xxxxxxxxxxx);
            Log.d("1.6", "gets to here");
            db.insert(SETTINGS_TABLE, null, initialValues);

    }

    @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 " + SETTINGS_TABLE);
        onCreate(db);

    } 

}

//end helper class
}

【讨论】:

  • 请解释一下否决票?
  • 如何在应用安装时做到这一点?这部分代码是否仅在安装时执行?
【解决方案2】:

我在这里的方式是在资产文件夹中提供一个预填充的数据库。您可以在那里放入文件并按原样使用它们。但是请注意,大小限制为 1MB,因此您可能必须拆分文件或压缩它们。

压缩非常方便,并且得到操作系统本身的良好支持。

希望这对您有所帮助:-)

【讨论】:

  • 大小限制为 1 MB。
【解决方案3】:

来自 SQLiteOpenHelper 的 JavaDoc:

管理数据库的辅助类 创建和版本管理。你 创建一个实现的子类 onCreate(SQLiteDatabase), onUpgrade(SQLiteDatabase,int,int) 以及可选的 onOpen(SQLiteDatabase), 这个类负责打开 数据库如果存在,创建它 如果没有,则将其升级为 必要的。交易用于 确保数据库始终位于 明智的状态。

例如,请参阅 NotePad 中的 NotePadProvider 类 示例应用程序,在示例/ SDK 目录。

所以如果你扩展这个类,你有 3 个方法在某些情况下会被调用,你可以选择做什么。 这是最好的做法:)

【讨论】:

    猜你喜欢
    • 2021-01-26
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    相关资源
    最近更新 更多