如何在我的 Android 程序的 SQLite Manager 应用程序中使用我创建的 SQLite DB
Posted
技术标签:
【中文标题】如何在我的 Android 程序的 SQLite Manager 应用程序中使用我创建的 SQLite DB【英文标题】:How to use my created SQLite DB in SQLite Manager apps in my Android program 【发布时间】:2013-03-01 17:27:24 【问题描述】:当我在我的 android 应用程序中处理许多表时,我决定在 SQLite 管理器(例如 firefox 插件或用于 sqlite 的 navicat)中创建数据库(DB)。我完成了它们的创建并导出了 .sql 文件!但我不知道如何使用这个文件! 当然,我发现一些关于此的帖子将 DB(在有根电话上)放在 ...data/data/your package name/ ..etc 但我不明白这一步之后该怎么做! (我只知道将 db 引入 android 应用程序的代码!!)
谁能一步一步告诉我如何在我的应用程序中使用我创建的数据库和这些方法?-
这是使用这些 SQLite 管理器的好方法,还是尽管使用代码在 android 中创建多表很复杂,但您更喜欢它???
sqlite 2 和 3 的主要区别是什么?它们是由不同的 Android 版本支持还是仅针对 Sqlite 的更新支持?
编辑:将 dB 复制到 assest 文件夹并使用代码进行复制后:
03-16 11:32:20.370: I/SqliteDatabaseCpp(3999): sqlite 返回: 错误代码 = 14, msg = 无法在 [8609a15dfa] 的第 27712 行打开文件, db=/data/data/com.androidhive.xmlparsing/数据库/surveydb.sqlite 03-16 11:32:20.370: I/SqliteDatabaseCpp(3999): sqlite 返回: 错误代码 = 14, msg = os_unix.c: open() at line 27712 - "" errno=2 path=/data/data/com .androidhive.xmlparsing/databases/surveydb.sqlite,db=/data/data/com.androidhive.xmlparsing/databases/surveydb.sqlite 03-16 11:32:20.370: E/SqliteDatabaseCpp(3999): sqlite3_open_v2("/data/data/com.androidhive.xmlparsing/databases/surveydb.sqlite", &handle, 1, NULL) 失败 03-16 11:32:20.380: E/SQLiteDatabase(3999): 无法打开数据库。关闭它。 03-16 11:32:20.380: E/SQLiteDatabase(3999): android.database.sqlite.SQLiteCantOpenDatabaseException: 无法打开数据库文件 03-16 11:32:20.380:E/SQLiteDatabase(3999):在 android.database.sqlite.SQLiteDatabase.dbopen(本机方法) 03-16 11:32:20.380: E/SQLiteDatabase(3999): 在 android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:983) 03-16 11:32:20.380: E/SQLiteDatabase(3999): 在 android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:956) 03-16 11:32:20.380: E/SQLiteDatabase(3999): 在 android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:932) 03-16 11:32:20.380: E/SQLiteDatabase(3999): 在 database.AssetDatabaseHelper.checkExist(AssetDatabaseHelper.java:55) 03-16 11:32:20.380: E/SQLiteDatabase(3999): 在 database.AssetDatabaseHelper.importIfNotExist(AssetDatabaseHelper.java:81) 03-16 11:32:20.380: E/SQLiteDatabase(3999): 在 com.androidhive.xmlparsing.AndroidXMLParsingActivity.onCreate(AndroidXMLParsingActivity.java:78) 03-16 11:32:20.380: E/SQLiteDatabase(3999): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1050) 03-16 11:32:20.380: E/SQLiteDatabase(3999): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1782) 03-16 11:32:20.380: E/SQLiteDatabase(3999): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1834) 03-16 11:32:20.380: E/SQLiteDatabase(3999): 在 android.app.ActivityThread.access$500(ActivityThread.java:122) 03-16 11:32:20.380: E/SQLiteDatabase(3999): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1027) 03-16 11:32:20.380: E/SQLiteDatabase(3999): 在 android.os.Handler.dispatchMessage(Handler.java:99) 03-16 11:32:20.380: E/SQLiteDatabase(3999): 在 android.os.Looper.loop(Looper.java:132) 03-16 11:32:20.380: E/SQLiteDatabase(3999): 在 android.app.ActivityThread.main(ActivityThread.java:4126) 03-16 11:32:20.380: E/SQLiteDatabase(3999): 在 java.lang.reflect.Method.invokeNative(Native Method) 03-16 11:32:20.380: E/SQLiteDatabase(3999): 在 java.lang.reflect.Method.invoke(Method.java:491) 03-16 11:32:20.380: E/SQLiteDatabase(3999): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844) 03-16 11:32:20.380: E/SQLiteDatabase(3999): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602) 03-16 11:32:20.380: E/SQLiteDatabase(3999): at dalvik.system.NativeStart.main(Native Method) 03-16 11:32:20.380: W/System.err(3999): android.database.sqlite.SQLiteCantOpenDatabaseException: 无法打开数据库文件 03-16 11:32:20.380:W/System.err(3999):在 android.database.sqlite.SQLiteDatabase.dbopen(本机方法) 03-16 11:32:20.380: W/System.err(3999): 在 android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:983) 03-16 11:32:20.380: W/System.err(3999): 在 android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:956) 03-16 11:32:20.380: W/System.err(3999): 在 android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:932) 03-16 11:32:20.380: W/System.err(3999): 在 database.AssetDatabaseHelper.checkExist(AssetDatabaseHelper.java:55) 03-16 11:32:20.380: W/System.err(3999): 在 database.AssetDatabaseHelper.importIfNotExist(AssetDatabaseHelper.java:81) 03-16 11:32:20.380: W/System.err(3999): 在 com.androidhive.xmlparsing.AndroidXMLParsingActivity.onCreate(AndroidXMLParsingActivity.java:78) 03-16 11:32:20.380: W/System.err(3999): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1050) 03-16 11:32:20.380: W/System.err(3999): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1782) 03-16 11:32:20.380: W/System.err(3999): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1834) 03-16 11:32:20.380: W/System.err(3999): 在 android.app.ActivityThread.access$500(ActivityThread.java:122) 03-16 11:32:20.380: W/System.err(3999): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1027) 03-16 11:32:20.380: W/System.err(3999): 在 android.os.Handler.dispatchMessage(Handler.java:99) 03-16 11:32:20.380: W/System.err(3999): 在 android.os.Looper.loop(Looper.java:132) 03-16 11:32:20.380: W/System.err(3999): 在 android.app.ActivityThread.main(ActivityThread.java:4126) 03-16 11:32:20.380: W/System.err(3999): 在 java.lang.reflect.Method.invokeNative(Native Method) 03-16 11:32:20.380: W/System.err(3999): 在 java.lang.reflect.Method.invoke(Method.java:491) 03-16 11:32:20.380: W/System.err(3999): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844) 03-16 11:32:20.380: W/System.err(3999): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602) 03-16 11:32:20.380: W/System.err(3999): 在 dalvik.system.NativeStart.main(Native Method)我使用了这个代码:
public class AssetDatabaseHelper extends SQLiteOpenHelper
private String dbName;
private String db_path;
private Context context;
/**
* A helpe r class to import db files.
*
* @param context
* base/app context
* @param dbName
* The name of the db in asset folder .
*/
public AssetDatabaseHelper(Context context, String dbName)
super(context, dbName, null, 1);
this.dbName = dbName;
this.context = context;
db_path = "/data/data/" + context.getPackageName() + "/databases/";
/**
* Check if the database already exist to avoid re-copying the file each
* time you open the application.
*
* @return true if it exists, false if it doesn't
*/
public boolean checkExist()
SQLiteDatabase checkDB = null;
try
String myPath = db_path + dbName;
checkDB = SQLiteDatabase.openDatabase(myPath, null,
SQLiteDatabase.OPEN_READONLY);
catch (SQLiteException e)
e.printStackTrace();
catch (Exception ep)
ep.printStackTrace();
if (checkDB != null)
checkDB.close();
return checkDB != null ? true : false;
/**
* Creates a empty database on the system and rewrites it with your own
* database.
* */
public void importIfNotExist() throws IOException
boolean dbExist = checkExist();
if (dbExist)
// do nothing - database already exist
else
this.getReadableDatabase();
try
copyDatabase();
catch (IOException e)
throw new Error("Error copying database");
/**
* Creates copies the database from asset to the new database location.
* */
private void copyDatabase() throws IOException
InputStream is = context.getAssets().open(dbName);
OutputStream os = new FileOutputStream(db_path + dbName);
byte[] buffer = new byte[4096];
int length;
while ((length = is.read(buffer)) > 0)
os.write(buffer, 0, length);
os.flush();
os.close();
is.close();
this.close();
@Override
public void onCreate(SQLiteDatabase db)
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
更新 2:数据库脚本:
CREATE TABLE "**" ("_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , "**" TEXT, "****" INTEGER); CREATE TABLE "***" ("_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , "***" INTEGER UNIQUE , "***" TEXT); CREATE TABLE "**" ("_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , "***" INTEGER UNIQUE , "**" INTEGER, "**" INTEGER, "**" TEXT, "impGender" TEXT, "* *" TEXT, "***" INTEGER, "***" DATETIME DEFAULT CURRENT_TIMESTAMP); CREATE TABLE "**" ("_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , "**" TEXT); CREATE TABLE "**" ("_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , "***" INTEGER UNIQUE , "***" TEXT, "srQType" INTEGER, "***" INTEGER, "**" BOOL, "**" FLOAT, "**" FLOAT, "**" INTEGER, "**" UNIQUE ); CREATE TABLE "*" ("_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , "**" INTEGER NOT NULL UNIQUE , "***" INTEGER, "**" INTEGER, "**" INTEGER, "**" INTEGER, “**”文本,“**”文本); CREATE TABLE "**" ("_id" INTEGER PRIMARY KEY, "***" TEXT); CREATE TABLE "**" ("_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , "**" TEXT, "srDesc" TEXT, "***" INTEGER, "**" DATETIME, "**" DATETIME, "** **" 整数, "srCode" 整数); CREATE TABLE "android_metadata" ("locale" TEXT DEFAULT 'en_US');最后:
new AssetDatabaseHelper(this , "surveydb.sqlite").importIfNotExist();
有什么问题?
你能帮帮我吗?
【问题讨论】:
【参考方案1】: Android 支持 Sqlite 3。 您不需要 root 手机即可使用导入的数据库导入数据库使用步骤:
-
将您的数据库转储到 /assets 文件夹中。
添加来自git hub here的代码
通过执行以下代码导入您的数据库。
AssetDatabaseHelper dbHelper = new AssetDatabaseHelper(
getBaseContext(), YOUR_DATABASE_NAME);
try
dbHelper.importIfNotExist();
catch (IOException e)
e.printStackTrace();
【讨论】:
还有 1 个问题:我的数据库(使用这些软件创建的)是“.sql”格式,而不是 .sqlite !!!好吗? 我也用 Firefox 的 sqlite 管理器创建了我的。你不要点击export
。新创建的数据库是一个扩展名为 .sqlite 的文件。你只需要那个文件。并按照步骤操作。
对不起,但这对我不起作用!!!我用 logcat 错误编辑问题!
您必须在异常第一次创建时捕获它。我更新了代码。
您确定在执行此代码之前不尝试打开它吗?这段代码应该是您对数据库所做的第一件事。以上是关于如何在我的 Android 程序的 SQLite Manager 应用程序中使用我创建的 SQLite DB的主要内容,如果未能解决你的问题,请参考以下文章
为啥 SQLite 替换功能会在我的 Android 应用程序中产生错误?
我应该在我的应用程序中使用 Android SharedPreferences 还是 SQLite 来实现持久性?
如何在 Android 应用程序中执行 SQLite 查询?