Android Studio 打开数据库报错

sunny_ckyh 2018-05-11 01:53:25
Android初学者...困扰了好久的错误 T.T,求助大佬帮忙
因为一直在报错,把代码最简化了尝试还是不可以,如下:
DBHelper.java
public class DBHelper extends SQLiteOpenHelper{
private static final String DB_NAME = "scenic";
private static final int DB_VERSION = 1;
private static final String DB_PATH = "/data/";
private SQLiteDatabase myDataBase;
DBHelper(Context context){
super(context, DB_NAME, null, DB_VERSION);
}
public void openDataBase() throws SQLException{
String myPath = DB_PATH + DB_NAME;
File file = new File(DB_PATH);
Log.e("", "文件夹存在");
if(!file.exists()){
Log.e("", "文件夹不存在,新建一个");
file.mkdirs();
}
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
}
public void onCreate(SQLiteDatabase db) {

}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
}
}

使用的.java代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DBHelper dbHelper = new DBHelper(showinfo.this);
try{
dbHelper.openDataBase();
}catch(Exception e){
System.out.println(e.toString());
}
}

结果:文件目录存在,openDataBase报错:
05-11 05:38:28.089 4743-4743/? E/SQLiteLog: (14) cannot open file at line 35803 of [605907e73a]
05-11 05:38:28.089 4743-4743/? E/SQLiteLog: (14) os_unix.c:35803: (2) open(/data/scenic) -
05-11 05:38:28.093 4743-4743/? E/SQLiteDatabase: Failed to open database '/data/scenic'.
android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:210)
at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:194)
at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:493)
at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:200)
at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:192)
at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:864)
at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:849)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:750)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:699)
at com.example.hp.mptest.DBHelper.openDataBase(DBHelper.java:49)
at com.example.hp.mptest.showinfo.onCreate(showinfo.java:28)
at android.app.Activity.performCreate(Activity.java:7009)
at android.app.Activity.performCreate(Activity.java:7000)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

...全文
1503 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunny_ckyh 2018-05-13
  • 打赏
  • 举报
回复
大家还有什么方法么...我打算换个模拟器试试
sunny_ckyh 2018-05-11
  • 打赏
  • 举报
回复
引用 6 楼 qq_36999309 的回复:
https://www.cnblogs.com/chutianyao/archive/2013/02/22/2922625.html 看看这个?好像问题跟你的有点类似
按帖子里的改了一下,将路径设置为: Environment.getExternalStorageDirectory().getAbsoluteFile().toString(); 但还是failes to open database
这个人中暑了 2018-05-11
  • 打赏
  • 举报
回复
https://www.cnblogs.com/chutianyao/archive/2013/02/22/2922625.html 看看这个?好像问题跟你的有点类似
这个人中暑了 2018-05-11
  • 打赏
  • 举报
回复
你的数据库还没有创建 应该在public class DBHelper extends SQLiteOpenHelper里的public void onCreate(SQLiteDatabase db) 里创建数据库 比如: @Override public void onCreate(SQLiteDatabase db) { String CREATE_TABLE="CREATE TABLE "+MemoContract.TABLE_NAME+"(" +MemoContract._ID+" INTEGER PRIMARY KEY AUTOINCREMENT, " +MemoContract.COLUMN_PLAN+" TEXT," +MemoContract.COLUMN_BEGIN_TIME_YEAR+" INTEGER," +MemoContract.COLUMN_BEGIN_TIME_MONTH+" INTEGER," +MemoContract.COLUMN_BEGIN_TIME_DAY+" INTEGER," +MemoContract.COLUMN_BEGIN_TIME_HOUR+" INTEGER," +MemoContract.COLUMN_BEGIN_TIME_MINUTE+" INTEGER," +MemoContract.COLUMN_END_TIME_YEAR+" INTEGER," +MemoContract.COLUMN_END_TIME_MONTH+" INTEGER," +MemoContract.COLUMN_END_TIME_DAY+" INTEGER," +MemoContract.COLUMN_END_TIME_HOUR+" INTEGER," +MemoContract.COLUMN_END_TIME_MINUTE+" INTEGER);"; db.execSQL(CREATE_TABLE); } 然后通过 SQLiteDatabase database=mHelper.getReadableDatabase(); 获取数据库
sunny_ckyh 2018-05-11
  • 打赏
  • 举报
回复
引用 4 楼 qq_36999309 的回复:
你的数据库还没有创建 应该在public class DBHelper extends SQLiteOpenHelper里的public void onCreate(SQLiteDatabase db) 里创建数据库 比如: @Override public void onCreate(SQLiteDatabase db) { String CREATE_TABLE="CREATE TABLE "+MemoContract.TABLE_NAME+"(" +MemoContract._ID+" INTEGER PRIMARY KEY AUTOINCREMENT, " +MemoContract.COLUMN_PLAN+" TEXT," +MemoContract.COLUMN_BEGIN_TIME_YEAR+" INTEGER," +MemoContract.COLUMN_BEGIN_TIME_MONTH+" INTEGER," +MemoContract.COLUMN_BEGIN_TIME_DAY+" INTEGER," +MemoContract.COLUMN_BEGIN_TIME_HOUR+" INTEGER," +MemoContract.COLUMN_BEGIN_TIME_MINUTE+" INTEGER," +MemoContract.COLUMN_END_TIME_YEAR+" INTEGER," +MemoContract.COLUMN_END_TIME_MONTH+" INTEGER," +MemoContract.COLUMN_END_TIME_DAY+" INTEGER," +MemoContract.COLUMN_END_TIME_HOUR+" INTEGER," +MemoContract.COLUMN_END_TIME_MINUTE+" INTEGER);"; db.execSQL(CREATE_TABLE); } 然后通过 SQLiteDatabase database=mHelper.getReadableDatabase(); 获取数据库
我尝试过使用这样的oncreat函数 public void onCreate(SQLiteDatabase db){ db.execSQL( "CREATE TABLE scenic_spot(" + "ID INTEGER PRIMARY KEY AUTOINCREMENT," + "NAME TEXT," + "LOG REAL," + "LAT REAL," + "INFO TEXT," + "IMAGE_ID INTEGER);" ); } 但是在执行之后,我没有在/data/data/包名/databases目录下看到新建的数据库,请问数据库是建立在这个目录下么,如果是的话,可能这里也存在问题
sunny_ckyh 2018-05-11
  • 打赏
  • 举报
回复
引用 1 楼 cxz003 的回复:
/data 文件夹里面没有权限访问的吧 你换个Environment.getExternalStorageDirectory(); 里面的文件夹试试
关于权限问题,我使用Android Device Monitor打开虚拟机的File Explorer 并使用命令chmod 777设置了data的权限,现在data的权限为drwxrwxrwx,数据库文件的权限为-rw-rw-rw-
sunny_ckyh 2018-05-11
  • 打赏
  • 举报
回复
引用 1 楼 cxz003 的回复:
/data 文件夹里面没有权限访问的吧 你换个Environment.getExternalStorageDirectory(); 里面的文件夹试试
我将DB_PATH更新为String apppath = Environment.getExternalStorageDirectory().toString(); 并将数据库放入文件夹 结果变成了Failed to open database '/storage/emulated/0/scenic'. 数据库为从Navicat For SQLite 导出的dbf文件
  • 打赏
  • 举报
回复
/data 文件夹里面没有权限访问的吧 你换个Environment.getExternalStorageDirectory(); 里面的文件夹试试
android开发期末大作业(项目源码,任务书,实验大报告,apk文件) 大作业的要求和内容:(包括题目选择范围、技术要求、递交时间、考核方法等) 一、实验项目名称 Android手机应用开发课程大作业 二、实验目的 1.通过本课程设计的实践及其前后的准备与总结,复习、领会、巩固和运用课堂上所学的Android手机应用开发知识。 2.为学生综合应用本专业所学习的多门课程知识(例如,软件工程、数据库、Java语言、Java Web开发等)创造实践机会。为学生提供主动学习、积极探索与大胆创新的机会。 3.掌握Android手机应用设计的方法与技巧。 三、实验内容及要求 1、设计内容 题目、设计内容自拟,工作量适中,要求学生应用课程所学知识,采用JAVA语言和Android手机应用开发技术实现一个完整的系统。 ①完成大作业报告。 ②实现各系统功能,并完成调试运行。 2、主要技术 采用Java语言并不仅限于Java语言实现系统。 开发环境与工具:Android Studio 3.2以上版本; 操作系统:Win7/Win10或其他; 4、设计成果: 材料上交:电子文档(大作业任务书+大作业报告+源代码,电子稿请刻在光盘上)、打印稿(大作业任务书+大作业报告)。 四、成绩评定: 考核标准包括: 1、选题的工作量,难度和新颖程度 2、系统架构设计是否良好,运行过程是否报错 3、界面设计的合理性和美观程度 4、基本功能的实现 分值60 (包括布局、组件、Activity、Intent等使用) 数据存储的使用 分值10 网络功能 分值10 Service、ContentProvider或BroadCastReceiver等的使用 分值10 附加分: 图形图像处理、多媒体处理等 分值10 5、考核方式为面对面答辩,在课程的后两周内集中进行。

80,472

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧