Android如何访问包含在资产文件夹中的SQLite数据库?

5
我已经有一个SQLite数据库,并将其放在我的项目的assets文件夹中。我阅读了Android文档,它说对于Android中的所有数据库,路径都是data/data/pack_name/database_name
这让我感到困惑。我只是把它放在assets文件夹中,所以路径是data/data/assets/database_name吗?

我推荐以下教程。它对我帮助很大。链接:在Android应用程序中使用自己的sqlite数据库 - Stefan Ciprian Hotoleanu
5个回答

7
包名不是项目名,包名是命名空间。参考Anthony的链接。
记得在DB_PATH字符串中将“YOUR_PACKAGE”更改为您的应用程序包命名空间(即:com.examplename.myapp)。(摘自引用块)
例如,从Hello World教程中,项目名称为HelloAndroid,但包名称为com.example.helloandroid 如果此应用程序有数据库,则会存储在data/data/com.example.helloandroid/database中。
要查看其他应用程序的情况,可以启动模拟器。在菜单栏中,您有您的avd的名称(我认为它代表Android虚拟设备)。在我的上面是“avdessay:5554”
(在Linux上)从命令行输入: adb -s emulator-5554 shell 您必须用您使用的端口替换5554。
如果您有命令提示符“#”,则可以输入: cd data/data

在那里,你会发现所有的内容都以包名的形式呈现。

更多信息 在这里


5
当您使用SQLiteDatabaseSQLiteOpenHelper类创建数据库时,它会在data/data/package_name/database中创建该数据库。
您可以通过使用以下方式访问该资源:
InputStream myInput = myContext.getAssets().open(your_database_here);

任何其他信息,请查看在Android应用程序中使用自己的SQLite数据库 package_name 部分的路径将是您的 包名 的名称。您可以在您的 .java 文件的第一行找到包的名称。
例如,我的类在顶部以此开始
package com.forloney.tracker;

我的数据库在 data/data/com.forloney.tracker/database 文件夹中。

希望这样说得清楚了。


"/data/data/YOUR_PACKAGE/databases/"的意思是“/data/data/你的包名/databases/”。如果我的项目名称是Helloworld,那么路径就是“/data/data/Helloworld/databases/”吗?谢谢。 - user275788
我相信那是正确的,但我现在正在工作,否则我会启动我的课程并直接回答你。 - Anthony Forloney
没问题,看一下我的编辑,有一个修订后的实际路径示例。 - Anthony Forloney
1
它将是这样的,但是使用/而不是. - data/data/com/forloney/tracker/database - Donal Rafferty

1

@ScCrow 我也按照this的例子操作,遇到了和你一样的问题,直到我意识到我没有正确使用DataBaseHelper(或者说我忽略了一个小问题)。

当你在活动中使用DatabaseHelper类时,你必须确保首先调用createDatabase!如果你查看openDatabase的代码,它不会检查数据库是否存在,因此你要么在每个使用它的活动中尝试创建数据库,要么修改openDatabase方法以检查数据库是否存在。实际上,发布的链接指导你以这种方式使用它,但你(像我一样)可能已经忽略了这一点。

不好:

DBAdapter db = new DBAdapter(this);
db.openDataBase(); //Bad! db not created yet!

好的:

DBAdapter db = new DBAdapter(this);
db.createDataBase(); //needs exception handling
db.openDataBase();

0

当我尝试打开我的数据库时,会收到“无法打开数据库文件”的错误提示。我认为这是因为找不到该数据库,而不是其他程序员的错误。在日志中,我看到了以下信息,它看起来很好。

   sqllite3_open_v2("/data/data/com.isildo.HelloListView/databases/ListsDB" ...

这是设置

private static String DB_PATH = "/data/data/com.isildo.HelloListView/databases/";    
private static String DB_NAME = "ListsDB";

在我的项目中,在包资源管理器中,我看到了ListsDb数据库。
所以我至少认为我全部正确。我正在使用这个例子: [http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/]
在这里的帖子中,有人提出了一些设置Assets参数的建议。 {没有回复}
**To get an ASSETS folder into your APK:
  In /nbproject/project.properties, 
     change assets.dir=
to
     assets.dir=assets 
     assets.available=true
In /nbproject/build-impl.xml, there is line in the “if=assets.available” target that reads
that needs to be changed to**

这是我们需要做的事情吗?如果是,我们能否得到更好的指导以了解所需的更改。我找不到要进行建议更改的位置。我查看了项目设置和其他内容。

是的,我对这个环境还很陌生,所以可能只是没有找到它们。我在Windows上使用Eclipse。


我在使用Eclipse时找不到我的项目中的build-impl.xml文件。 - herbertD

0
在你的DBAdapter.java文件中,将openDatabase方法的返回类型更改为SQLiteDatabase
当你访问数据库时,只需使用SQLiteDatabase data = db.openDatabase(),其中dbDBAdapter db = new DBAdapter(this)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接