Android 无法打开数据库Sqlite文件
关于这个问题我发现了很多问题,但我无法解决。我在资产文件夹中有一个sqlite数据库:Android 无法打开数据库Sqlite文件,android,sqlite,android-assets,Android,Sqlite,Android Assets,关于这个问题我发现了很多问题,但我无法解决。我在资产文件夹中有一个sqlite数据库: assets/data/data/{package_name}/databases/dbtest.sqlite 我试图: 卸载项目 清理项目 刷新并重新启动eClipse 我查了一下我的包裹名 我检查了我的数据库文件名 但是我不能解决它。我不知道我错在哪里 提前谢谢 DBHelper.java public class DBHelper extends SQLiteOpenHelper { pri
assets/data/data/{package_name}/databases/dbtest.sqlite
我试图:
public class DBHelper extends SQLiteOpenHelper {
private static String DB_PATH = "/data/data/com.exasmple.dbexam/databases/";
private static String DB_NAME = "dbtest.sqlite";
public static final String APP_TABLE = "land";
private static final int DATABASE_VER5ION = 1;
private static final String TYPE = "type";
private static final String ID = "id";
private SQLiteDatabase myDataBase;
private final Context myContext;
public static String state;
public DBHelper(Context context) {
super(context, DB_NAME, null, DATABASE_VER5ION);
this.myContext = context;
}
public void createDataBase() throws IOException {
// System.out.println("Creating database");
boolean dbExist = checkDataBase();
if (!dbExist) {
this.getReadableDatabase();
try {
copyDataBase();
} catch (IOException e) {
throw new Error("Error copying database");
}
}
}
private boolean checkDataBase() {
SQLiteDatabase checkDB = null;
try {
String myPath = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null,
SQLiteDatabase.OPEN_READONLY);
} catch (SQLiteException e) {
}
if (checkDB != null) {
checkDB.close();
}
return checkDB != null ? true : false;
}
private void copyDataBase() throws IOException {
InputStream myInput = myContext.getAssets().open(DB_NAME);
String outFileName = DB_PATH + DB_NAME;
OutputStream myOutput = new FileOutputStream(outFileName);
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();
System.out.println("Database copied into system data");
}
public void openDataBase() throws SQLException {
System.out.println("Open database");
String myPath = DB_PATH + DB_NAME;
myDataBase = SQLiteDatabase.openDatabase(myPath, null,
SQLiteDatabase.OPEN_READWRITE);// SQLiteDatabase.NO_LOCALIZED_COLLATORS);
}
@Override
public synchronized void close() {
if (myDataBase != null)
myDataBase.close();
super.close();
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS report");
db.execSQL("DROP TABLE IF EXISTS appstatus");
onCreate(db);
}
public ArrayList<String> GetGroupName() {
String sql = "";
// System.out.println("Inside Database");
sql = "select chapterid from content";
ArrayList<String> list = new ArrayList<String>();
Cursor cursor = myDataBase.rawQuery(sql, null);
try {
if (cursor != null) {
if (cursor.moveToFirst()) {
do {
list.add(cursor.getString(0));
System.out.println("dblist value==" + list);
} while (cursor.moveToNext());
}
if (cursor != null && !cursor.isClosed()) {
cursor.close();
}
} else
Toast.makeText(myContext, "No values in DB", Toast.LENGTH_SHORT)
.show();
} catch (Exception e) {
System.out.println("GetGradeNames(): " + e);
}
return list;
}
}
public类DBHelper扩展了SQLiteOpenHelper{
私有静态字符串DB_PATH=“/data/data/com.exasmple.dbexam/databases/”;
私有静态字符串DB_NAME=“dbtest.sqlite”;
公共静态最终字符串APP_TABLE=“land”;
私有静态最终int数据库版本=1;
私有静态最终字符串TYPE=“TYPE”;
私有静态最终字符串ID=“ID”;
私有SQLiteDatabase-myDataBase;
私有最终上下文myContext;
公共静态字符串状态;
公共DBHelper(上下文){
super(上下文、数据库名称、null、数据库版本);
this.myContext=上下文;
}
public void createDataBase()引发IOException{
//System.out.println(“创建数据库”);
布尔值dbExist=checkDataBase();
如果(!dbExist){
这是.getReadableDatabase();
试一试{
copyDataBase();
}捕获(IOE异常){
抛出新错误(“复制数据库时出错”);
}
}
}
私有布尔校验数据库(){
SQLiteDatabase checkDB=null;
试一试{
字符串myPath=DB_PATH+DB_NAME;
checkDB=SQLiteDatabase.openDatabase(myPath,null,
SQLiteDatabase.OPEN_READONLY);
}catch(sqlitee异常){
}
if(checkDB!=null){
checkDB.close();
}
return checkDB!=null?true:false;
}
私有void copyDataBase()引发IOException{
InputStream myInput=myContext.getAssets().open(DB_NAME);
字符串outFileName=DB_路径+DB_名称;
OutputStream myOutput=新文件OutputStream(outFileName);
字节[]缓冲区=新字节[1024];
整数长度;
而((长度=myInput.read(缓冲区))>0){
写入(缓冲区,0,长度);
}
myOutput.flush();
myOutput.close();
myInput.close();
System.out.println(“复制到系统数据中的数据库”);
}
public void openDataBase()引发SQLException{
System.out.println(“开放数据库”);
字符串myPath=DB_PATH+DB_NAME;
myDataBase=SQLiteDatabase.openDatabase(myPath,null,
SQLiteDatabase.OPEN_READWRITE);//SQLiteDatabase.NO_本地化的_COLLATORS);
}
@凌驾
公共同步作废关闭(){
if(myDataBase!=null)
myDataBase.close();
super.close();
}
@凌驾
public void onCreate(SQLiteDatabase db){
}
@凌驾
public void onUpgrade(SQLiteDatabase db,int-oldVersion,int-newVersion){
db.execSQL(“如果存在删除表报告”);
db.execSQL(“如果存在,则删除表appstatus”);
onCreate(db);
}
公共ArrayList GetGroupName(){
字符串sql=“”;
//System.out.println(“内部数据库”);
sql=“从内容中选择章节ID”;
ArrayList=新建ArrayList();
Cursor=myDataBase.rawQuery(sql,null);
试一试{
如果(光标!=null){
if(cursor.moveToFirst()){
做{
list.add(cursor.getString(0));
System.out.println(“dblist值=”+list);
}while(cursor.moveToNext());
}
if(cursor!=null&!cursor.isClosed()){
cursor.close();
}
}否则
Toast.makeText(myContext,“数据库中无值”,Toast.LENGTH\u SHORT)
.show();
}捕获(例外e){
System.out.println(“GetGradeNames():”+e);
}
退货清单;
}
}
Logcat:
07-09 14:57:27.834: E/AndroidRuntime(987): FATAL EXCEPTION: main
07-09 14:57:27.834: E/AndroidRuntime(987): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.exasmple.dbexam/com.exasmple.dbexam.MainActivity}: android.database.sqlite.SQLiteException: unable to open database file
07-09 14:57:27.834: E/AndroidRuntime(987): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
07-09 14:57:27.834: E/AndroidRuntime(987): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
07-09 14:57:27.834: E/AndroidRuntime(987): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
07-09 14:57:27.834: E/AndroidRuntime(987): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
07-09 14:57:27.834: E/AndroidRuntime(987): at android.os.Handler.dispatchMessage(Handler.java:99)
07-09 14:57:27.834: E/AndroidRuntime(987): at android.os.Looper.loop(Looper.java:130)
07-09 14:57:27.834: E/AndroidRuntime(987): at android.app.ActivityThread.main(ActivityThread.java:3683)
07-09 14:57:27.834: E/AndroidRuntime(987): at java.lang.reflect.Method.invokeNative(Native Method)
07-09 14:57:27.834: E/AndroidRuntime(987): at java.lang.reflect.Method.invoke(Method.java:507)
07-09 14:57:27.834: E/AndroidRuntime(987): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
07-09 14:57:27.834: E/AndroidRuntime(987): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
07-09 14:57:27.834: E/AndroidRuntime(987): at dalvik.system.NativeStart.main(Native Method)
07-09 14:57:27.834: E/AndroidRuntime(987): Caused by: android.database.sqlite.SQLiteException: unable to open database file
07-09 14:57:27.834: E/AndroidRuntime(987): at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
07-09 14:57:27.834: E/AndroidRuntime(987): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1849)
07-09 14:57:27.834: E/AndroidRuntime(987): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820)
07-09 14:57:27.834: E/AndroidRuntime(987): at com.exasmple.dbexam.DBHelper.openDataBase(DBHelper.java:138)
07-09 14:57:27.834: E/AndroidRuntime(987): at com.exasmple.dbexam.MainActivity.onCreate(MainActivity.java:21)
07-09 14:57:27.834: E/AndroidRuntime(987): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
07-09 14:57:27.834: E/AndroidRuntime(987): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
07-09 14:57:27.834: E/AndroidRuntime(987): ... 11 more
07-09 14:57:27.834:E/AndroidRuntime(987):致命异常:main
07-09 14:57:27.834:E/AndroidRuntime(987):java.lang.RuntimeException:无法启动活动组件信息{com.exasmple.dbexam/com.exasmple.dbexam.MainActivity}:android.database.sqlite.SQLiteException:无法打开数据库文件
07-09 14:57:27.834:E/AndroidRuntime(987):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
07-09 14:57:27.834:E/AndroidRuntime(987):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
07-09 14:57:27.834:E/AndroidRuntime(987):在android.app.ActivityThread.access$1500(ActivityThread.java:117)
07-09 14:57:27.834:E/AndroidRuntime(987):在android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
07-09 14:57:27.834:E/AndroidRuntime(987):在android.os.Handler.dispatchMessage(Handler.java:99)上
07-09 14:57:27.834:E/AndroidRuntime(987):在android.os.Looper.loop(Looper.java:130)上
07-09 14:57:27.834:E/AndroidRuntime(987):在android.app.ActivityThread.main(ActivityThread.java:3683)上
07-09 14:57:27.834:E/AndroidRuntime(987):位于java.lang.reflect.Method.Invokenactive(本机方法)
07-09 14:57:27.834:E/AndroidRuntime(987):位于java.lang.reflect.Method.invoke(Method.java:507)
07-09 14:57:27.834:E/AndroidRuntime(987):在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
07-09 14:57:27.834:E/AndroidRuntime(987):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
07-09 14:57:27.834:E/AndroidRuntime(987):在dalvik.system.NativeStart.main(本机方法)
07-09 14:57:27.834:E/AndroidRuntime(987):原因:android.database.sqlite.sqlite异常:无法打开数据库文件
07-09 14:57:27.834:E/AndroidRuntime(987):在android.database.sqlite.SQLiteDatabase.dbopen(原生的M
DB_NAME="dbtest";
DB_PATH = "/data/data/com.exasmple.dbexam/databases/";
public void createDataBase() throws IOException {
// System.out.println("Creating database");
boolean dbExist = checkDataBase();
if (dbExist == true) {
this.getReadableDatabase();
try {
this.openDataBase();
} catch (SQLException e) {
e.printStackTrace();
}
try {
copyDataBase();
} catch (IOException e) {
throw new Error("Error copying database");
}
}
}
private static String DB_NAME = "dbtest.sqlite";
private static String DB_NAME = "dbtest.db";
public class DBHelper extends SQLiteOpenHelper {
public int GetCursor;
// ****************** Declare all the global variable
// ****************************//
private Context myContext;
public String DB_PATH = "data/data/com.exasmple.dbexam/databases/"; // path
// of
// your
// datbase
public static String DB_NAME = "Test.sqlite";// your database name
static String ASSETS_DB_FOLDER = "db";
private SQLiteDatabase db;
public DBHelper(Context context) {
super(context, DB_NAME, null, 2);
if (db != null && db.isOpen())
close();
this.myContext = context;
//DB_NAME = db_name;
try {
createDataBase();
openDataBase();
} catch (IOException e) {
// System.out.println("Exception in creation of database : "+
// e.getMessage());
e.printStackTrace();
}
}
public void createDataBase() throws IOException {
boolean dbExist = checkDataBase();
if (dbExist) {
// System.out.println("Database Exist");
} else {
this.getReadableDatabase();
try {
copyDatabase();
} catch (IOException e) {
throw new Error("Error copying database");
}
}
}
private void copyDatabase() throws IOException {
InputStream input = myContext.getAssets().open(DB_NAME);
String outputFileName = DB_PATH + DB_NAME;
OutputStream output = new FileOutputStream(outputFileName);
byte[] buffer = new byte[1024];
int length;
while ((length = input.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
// Close the streams
output.flush();
output.close();
input.close();
// System.out.println(DB_NAME + "Database Copied !");
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public void openDataBase() throws SQLException {
// Open the database
String myPath = DB_PATH + DB_NAME;
db = SQLiteDatabase.openDatabase(myPath, null,
SQLiteDatabase.OPEN_READWRITE);
}
public boolean isOpen() {
if (db != null)
return db.isOpen();
return false;
}
@Override
public synchronized void close() {
if (db != null)
db.close();
super.close();
}
private boolean checkDataBase() {
SQLiteDatabase checkDB = null;
try {
String myPath = DB_PATH + DB_NAME;
// System.out.println("My Pathe is:- " + myPath);
// System.out.println("Open");
checkDB = SQLiteDatabase.openDatabase(myPath, null,
SQLiteDatabase.OPEN_READWRITE);
// System.out.println("checkDB value:" + checkDB);
// System.out.println("My Pathe is:- " + myPath);
} catch (Exception e) {
// database does't exist yet.
}
if (checkDB != null) {
// System.out.println("Closed");
checkDB.close();
// System.out.println("My db is:- " + checkDB.isOpen());
}
return checkDB != null ? true : false;
}
public Cursor execCursorQuery(String sql) {
Cursor cursor = null;
try {
cursor = db.rawQuery(sql, null);
GetCursor = cursor.getCount();
Log.i("Inside execCursorQuery try", sql);
} catch (Exception e) {
Log.i("Inside execCursorQuery exception", e.getMessage());
}
return cursor;
}
public void execNonQuery(String sql) {
try {
db.execSQL(sql);
// Log.d("SQL", sql);
} catch (Exception e) {
// Log.e("Err", e.getMessage());
} finally {
// closeDb();
}
}
public ArrayList<String> GetchapterID(){
String sql="";
//System.out.println("Inside Database");
sql="select distinct(ChapterId) from contents";
ArrayList<String> list = new ArrayList<String>();
Cursor cursor=db.rawQuery(sql, null);
try{
if(cursor != null){
if (cursor.moveToFirst()) {
do {
list.add(cursor.getString(0));
}
while (cursor.moveToNext());
}
if (cursor != null && !cursor.isClosed()) {
cursor.close();
}
}
else
Toast.makeText(myContext, "No values in DB", Toast.LENGTH_SHORT).show();
}
catch(Exception e){
System.out.println("GetGradeNames(): " +e);
}
return list;
}
}