Android 应用程序如何在用户安装后自动用值填充其数据库?
How does an Android app automatically fill its database with values after the user installs it?
这是 的后续问题。
我正在阅读 Android.com 中的 this tutorial,我在遵循教程的同时编写了这段代码:
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.provider.BaseColumns;
public final class SongDbHelper extends SQLiteOpenHelper {
// If you change the database schema, you must increment the database version.
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "Song.db";
private static final String TEXT_TYPE = " TEXT";
private static final String PRIMARY_KEY_TYPE = " INTEGER PRIMARY KEY";
private static final String COMMA_SEP = ",";
private static final String SQL_CREATE_ENTRIES =
"CREATE TABLE " + SongEntry.TABLE_NAME + " (" +
SongEntry._ID + PRIMARY_KEY_TYPE + COMMA_SEP +
SongEntry.COLUMN_NAME_SONG_TITLE + TEXT_TYPE + COMMA_SEP +
SongEntry.COLUMN_NAME_ENGLISH_LYRICS + TEXT_TYPE + COMMA_SEP +
SongEntry.COLUMN_NAME_ROMAJI_LYRICS + TEXT_TYPE + COMMA_SEP +
SongEntry.COLUMN_NAME_KANJI_LYRICS + TEXT_TYPE + COMMA_SEP +
SongEntry.COLUMN_NAME_INFO + TEXT_TYPE +
" )";
private static final String SQL_DELETE_ENTRIES =
"DROP TABLE IF EXISTS " + SongEntry.TABLE_NAME;
public SongDbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public void onCreate(SQLiteDatabase db) {
db.execSQL(SQL_CREATE_ENTRIES);
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// This database is only a cache for online data, so its upgrade policy is
// to simply to discard the data and start over
db.execSQL(SQL_DELETE_ENTRIES);
onCreate(db);
}
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
onUpgrade(db, oldVersion, newVersion);
}
public static abstract class SongEntry implements BaseColumns {
public static final String TABLE_NAME = "Song";
public static final String COLUMN_NAME_SONG_TITLE = "song_title";
public static final String COLUMN_NAME_ENGLISH_LYRICS = "english_lyrics";
public static final String COLUMN_NAME_ROMAJI_LYRICS = "romaji_lyrics";
public static final String COLUMN_NAME_KANJI_LYRICS = "kanji_lyrics";
public static final String COLUMN_NAME_INFO = "info";
}
}
当我将我的应用程序发布到 Google Play 商店,并且用户安装它时,将自动调用 SongDbHelper.onCreate()
,用我的 Song
[=50= 创建一个数据库]. 这个数据库是如何填充值的? 我猜我需要在 SongDbHelper.onCreate()
方法中编写代码来填充数据。这意味着我需要将数据存储在源代码中的某个地方。
我想将我的歌词存储在我的 strings.xml
文件中,但这似乎是多余的。然后,歌词将在 strings.xml
文件 和 数据库中。在那种情况下我几乎不需要数据库,除非我需要对数据调用 SELECT
来过滤它。 这真的是人们填写数据库的方式吗?
理想情况下,我想自己填充数据库,然后让用户从应用商店下载数据库。人们说我们不能那样做。真的是这样吗? 将数据放在两个地方(数据库和strings.xml
)似乎是一种浪费。我可能有一个很多数据!
大多数人的应用程序都是从互联网服务器下载数据库吗?我希望我发布的所有应用程序都不需要互联网服务器,而只需托管数据库 Google 播放。
是的,如果您想要预加载数据,您需要将它们作为资产或资源包含在您的应用中。它确实需要 space.
的两倍
但这通常用于在没有互联网连接的情况下首次启动时获取数据,然后通过互联网添加新的和更新的数据。
如果您不想为服务器付费:您可以在 Gogle App Engine 免费获得一个网站。如果您只想存储 xml 个文件或图像,这很容易。
可以包含一个已填充的数据库,这可能会有所帮助:Ship an application with a database您不必 运行 您自己的服务器或下载或任何东西,因为任意文件放在 assets
文件夹将包含在您的 APK 中。
(但是,如果这会使您的 APK 大于 50MB,您将需要处理某种下载。为此,Google 提供了 expansion files 系统,因此您仍然不需要不需要您自己的 Web 服务器。)
在更简单的情况下,我相信在 onCreate
中仅 运行 一些 insert
查询是常见的做法,就像您阅读的教程中那样。
这是
我正在阅读 Android.com 中的 this tutorial,我在遵循教程的同时编写了这段代码:
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.provider.BaseColumns;
public final class SongDbHelper extends SQLiteOpenHelper {
// If you change the database schema, you must increment the database version.
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "Song.db";
private static final String TEXT_TYPE = " TEXT";
private static final String PRIMARY_KEY_TYPE = " INTEGER PRIMARY KEY";
private static final String COMMA_SEP = ",";
private static final String SQL_CREATE_ENTRIES =
"CREATE TABLE " + SongEntry.TABLE_NAME + " (" +
SongEntry._ID + PRIMARY_KEY_TYPE + COMMA_SEP +
SongEntry.COLUMN_NAME_SONG_TITLE + TEXT_TYPE + COMMA_SEP +
SongEntry.COLUMN_NAME_ENGLISH_LYRICS + TEXT_TYPE + COMMA_SEP +
SongEntry.COLUMN_NAME_ROMAJI_LYRICS + TEXT_TYPE + COMMA_SEP +
SongEntry.COLUMN_NAME_KANJI_LYRICS + TEXT_TYPE + COMMA_SEP +
SongEntry.COLUMN_NAME_INFO + TEXT_TYPE +
" )";
private static final String SQL_DELETE_ENTRIES =
"DROP TABLE IF EXISTS " + SongEntry.TABLE_NAME;
public SongDbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public void onCreate(SQLiteDatabase db) {
db.execSQL(SQL_CREATE_ENTRIES);
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// This database is only a cache for online data, so its upgrade policy is
// to simply to discard the data and start over
db.execSQL(SQL_DELETE_ENTRIES);
onCreate(db);
}
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
onUpgrade(db, oldVersion, newVersion);
}
public static abstract class SongEntry implements BaseColumns {
public static final String TABLE_NAME = "Song";
public static final String COLUMN_NAME_SONG_TITLE = "song_title";
public static final String COLUMN_NAME_ENGLISH_LYRICS = "english_lyrics";
public static final String COLUMN_NAME_ROMAJI_LYRICS = "romaji_lyrics";
public static final String COLUMN_NAME_KANJI_LYRICS = "kanji_lyrics";
public static final String COLUMN_NAME_INFO = "info";
}
}
当我将我的应用程序发布到 Google Play 商店,并且用户安装它时,将自动调用 SongDbHelper.onCreate()
,用我的 Song
[=50= 创建一个数据库]. 这个数据库是如何填充值的? 我猜我需要在 SongDbHelper.onCreate()
方法中编写代码来填充数据。这意味着我需要将数据存储在源代码中的某个地方。
我想将我的歌词存储在我的 strings.xml
文件中,但这似乎是多余的。然后,歌词将在 strings.xml
文件 和 数据库中。在那种情况下我几乎不需要数据库,除非我需要对数据调用 SELECT
来过滤它。 这真的是人们填写数据库的方式吗?
理想情况下,我想自己填充数据库,然后让用户从应用商店下载数据库。人们说我们不能那样做。真的是这样吗? 将数据放在两个地方(数据库和strings.xml
)似乎是一种浪费。我可能有一个很多数据!
大多数人的应用程序都是从互联网服务器下载数据库吗?我希望我发布的所有应用程序都不需要互联网服务器,而只需托管数据库 Google 播放。
是的,如果您想要预加载数据,您需要将它们作为资产或资源包含在您的应用中。它确实需要 space.
的两倍但这通常用于在没有互联网连接的情况下首次启动时获取数据,然后通过互联网添加新的和更新的数据。
如果您不想为服务器付费:您可以在 Gogle App Engine 免费获得一个网站。如果您只想存储 xml 个文件或图像,这很容易。
可以包含一个已填充的数据库,这可能会有所帮助:Ship an application with a database您不必 运行 您自己的服务器或下载或任何东西,因为任意文件放在 assets
文件夹将包含在您的 APK 中。
(但是,如果这会使您的 APK 大于 50MB,您将需要处理某种下载。为此,Google 提供了 expansion files 系统,因此您仍然不需要不需要您自己的 Web 服务器。)
在更简单的情况下,我相信在 onCreate
中仅 运行 一些 insert
查询是常见的做法,就像您阅读的教程中那样。