Understanding Android.comamp;#39;s amp;quot;Saving Data in SQL Databasesamp;quot; Tutorial(了解Android.comamp;samp;在SQL数据库中保存数据教程)
问题描述
我正在阅读本教程:http://developer.android.com/training/basics/data-storage/databases.html,它提出了很多问题。
这是我在学习本教程时编写的代码:
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 = "c29uZ190aXRsZQ==";
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";
}
}
我们是否应该在应用每次打开时都调用
SongDbHelper.onCreate()
?(我设想将其放入我的主活动的onCreate()
方法中。如果您多次调用
SongDbHelper.onCreate()
,它是重新创建表,还是SongDbHelper.onCreate()
只是静默正常失败?APP为什么要调用
SongDbHelper.onCreate()
呢?如果我将我的应用放到应用商店上,难道我不会只让人们下载我已经填满数据的数据库吗?何时/在我的应用程序中调用
SongDbHelper.onUpgrade()
?我假设当用户注意到"这个应用程序有可用的更新。点击这里下载它"或类似的东西时,就会发生这种情况。我只是感到困惑,因为我假设用户只是下载了一个数据库完好无损的.db
文件,因此不需要调用SongDbHelper.onCreate()
。如果APP必须调用
SongDbHelper.onCreate()
,它如何在数据库中填充值?我认为如果我还有填充值的代码,这将违背数据库的目的,因为这样值就会重复(在代码和数据库中)。向数据库填充值的最佳方式是什么?使用终端,或以编程方式在应用程序之外的单独程序中,还是仅在Android应用程序中?
推荐答案
答案:
第1,2,3点:正如您在this link所遵循的教程中简单提到的,我们不应该调用SongDbHelper.onCreate()
。当我们要从Helper类引用数据库时,我们使用CONSTUCTOR,而不是它:
SongDbHelper mDbHelper = new SongDbHelper(getContext());
// this will call super method internally and
// this will create table in database
第四点:onUpgrade()
也不是我们明确要求的责任。当我们更改数据库模式时,我们会更新DATABASE_VERSION
,Android框架将在内部为我们调用onUpgrade()
xml
到database
逐个存储歌词。据我所知,这条路是对的
更新:
最好的方法是在之前,download it from the web server
创建的Web服务器上store your database
,并使应用程序然后读/写到数据库。此不会违背数据库的用途,而且不会重复数据库条目和代码条目(XML)。除此之外,您应用程序大小也会更小,因为应用程序将在运行时下载数据库,而不是最初存储在设备内存中
这篇关于了解Android.com&;s&;在SQL数据库中保存数据教程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!