Java 使用android studio打开sqlite数据库时出错

Java 使用android studio打开sqlite数据库时出错,java,android,ios,database,sqlite,Java,Android,Ios,Database,Sqlite,我可以知道为什么我运行此项目时出现此错误,并且设备上的应用程序不幸停止。错误为。android.database.sqlite.SQLiteCantoPendDatabaseException:未知错误(代码14):无法打开数据库 package dijkstra.app.com.demodistancev8; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; imp

我可以知道为什么我运行此项目时出现此错误,并且设备上的应用程序不幸停止。错误为。android.database.sqlite.SQLiteCantoPendDatabaseException:未知错误(代码14):无法打开数据库

package dijkstra.app.com.demodistancev8;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import android.widget.Toast;

//http://cariprogram.blogspot.com

public class SQLHelper extends SQLiteOpenHelper{

private static final String DATABASE_NAME = "schoolnav.sqlite";
private static final int DATABASE_VERSION = 1;
private static String DB_PATH = "/data/data/com.app.dijkstra/databases/";
private Context myContext;

public SQLHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    // TODO Auto-generated constructor stub
    myContext=context;
}

public void createDataBase() throws IOException{
    if(DataBaseisExist()){
        //do nothing - database already exist
        Toast.makeText(myContext, "Database Sudah Ada", Toast.LENGTH_LONG).show();
    }
    else{
        //By calling this method and empty database will be created into the default system path
           //of your application so we are gonna be able to overwrite that database with our database.
        this.getReadableDatabase();

        try {
            copyDataBase();
            Toast.makeText(myContext, "Database Berhasil Diimport Dari Assets", Toast.LENGTH_LONG).show();
        } catch (IOException e) {
            throw new Error("Error copying database");
        }
    }

}

private boolean DataBaseisExist(){
    SQLiteDatabase checkDB = null;
    try{
        String myPath = DB_PATH + DATABASE_NAME;
        checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

    }catch(SQLiteException e){
        //database does't exist yet.
    }
    if(checkDB != null){
        checkDB.close();
    }
    if(checkDB != null )return true ;else return false;
}

private void copyDataBase() throws IOException{
    //Open your local db as the input stream
    InputStream myInput = myContext.getAssets().open(DATABASE_NAME);
    // Path to the just created empty db
    String outFileName = DB_PATH + DATABASE_NAME;
    //Open the empty db as the output stream
    OutputStream myOutput = new FileOutputStream(outFileName);
    //transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer))>0){
        myOutput.write(buffer, 0, length);
    }
    //Close the streams
    myOutput.flush();
    myOutput.close();
    myInput.close();
}

@Override
public void onCreate(SQLiteDatabase db) {

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub

}
}}


<?xml version="1.0" encoding="utf-8"?>
package dijkstra.app.com.demodistancev8;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.OutputStream;
导入android.content.Context;
导入android.database.sqlite.SQLiteDatabase;
导入android.database.sqlite.SQLiteException;
导入android.database.sqlite.SQLiteOpenHelper;
导入android.util.Log;
导入android.widget.Toast;
//http://cariprogram.blogspot.com
公共类SQLHelper扩展了SQLiteOpenHelper{
私有静态最终字符串数据库\u NAME=“schoolnav.sqlite”;
私有静态最终int数据库_VERSION=1;
私有静态字符串DB_PATH=“/data/data/com.app.dijkstra/databases/”;
私人语境;
公共SQLHelper(上下文){
super(上下文、数据库名称、null、数据库版本);
//TODO自动生成的构造函数存根
myContext=上下文;
}
public void createDataBase()引发IOException{
if(DataBaseisExist()){
//不执行任何操作-数据库已存在
Toast.makeText(myContext,“数据库Sudah Ada”,Toast.LENGTH_LONG.show();
}
否则{
//通过调用此方法,将在默认系统路径中创建空数据库
//所以我们可以用我们的数据库覆盖那个数据库。
这是.getReadableDatabase();
试一试{
copyDataBase();
Toast.makeText(myContext,“数据库Berhasil Diimport Dari资产”,Toast.LENGTH_LONG.show();
}捕获(IOE异常){
抛出新错误(“复制数据库时出错”);
}
}
}
私有布尔数据库ISEXist(){
SQLiteDatabase checkDB=null;
试一试{
字符串myPath=DB_路径+数据库_名称;
checkDB=SQLiteDatabase.openDatabase(myPath,null,SQLiteDatabase.OPEN\u READONLY);
}catch(sqlitee异常){
//数据库还不存在。
}
if(checkDB!=null){
checkDB.close();
}
if(checkDB!=null)返回true;否则返回false;
}
私有void copyDataBase()引发IOException{
//打开本地数据库作为输入流
InputStream myInput=myContext.getAssets().open(数据库名称);
//刚创建的空数据库的路径
字符串outFileName=DB\u路径+数据库\u名称;
//打开空数据库作为输出流
OutputStream myOutput=新文件OutputStream(outFileName);
//将字节从输入文件传输到输出文件
字节[]缓冲区=新字节[1024];
整数长度;
而((长度=myInput.read(缓冲区))>0){
写入(缓冲区,0,长度);
}
//关闭溪流
myOutput.flush();
myOutput.close();
myInput.close();
}
@凌驾
public void onCreate(SQLiteDatabase db){
}
@凌驾
public void onUpgrade(SQLiteDatabase db,int-oldVersion,int-newVersion){
//TODO自动生成的方法存根
}
}}


要将数据从资产安全复制到应用程序数据文件夹,您可以尝试以下代码:

String appDataDir = ContextWrapper.getFilesDir();

String copyDBPath = appDataDir + "/" + DATABASE_NAME;

只是不要使用硬编码的路径,我的sqlite在没有路径的情况下工作。 我的代码:

public class PoiDbOpenHelper extends SQLiteOpenHelper {

    private static final int DATABASE_VERSION = 4;
    private static final String DATABASE_NAME = "pois.db";

    public static final String TABLE_POI = "tblpoi";
    public static final String TABLE_SQLITE_SEQUENCE = "sqlite_sequence";

    public static final String COLUMN_ID = "_id";
    public static final String COLUMN_LAT = "latitude";
    public static final String COLUMN_LNG = "longitude";
    public static final String COLUMN_NAME = "name";
    public static final String COLUMN_CITY = "city";

    public static final String CREATE_TABLE_POI = "create table "
            + TABLE_POI + "("
            + COLUMN_ID + " integer primary key autoincrement, "
            + COLUMN_LAT + " real not null, "
            + COLUMN_LNG + " real not null, "
            + COLUMN_NAME + " text not null, "
            + COLUMN_CITY + " text not null "
            + ");";
    ...

我使用android studio构建这个项目,你不应该像那样固定DB_路径。相反,您可以在运行时构建DB_路径,以提取您的应用程序数据路径。@Giaple您能教我需要更正什么吗?您可以在我的回答中尝试代码为什么要给它一个硬编码路径??它没有用
public class PoiDbOpenHelper extends SQLiteOpenHelper {

    private static final int DATABASE_VERSION = 4;
    private static final String DATABASE_NAME = "pois.db";

    public static final String TABLE_POI = "tblpoi";
    public static final String TABLE_SQLITE_SEQUENCE = "sqlite_sequence";

    public static final String COLUMN_ID = "_id";
    public static final String COLUMN_LAT = "latitude";
    public static final String COLUMN_LNG = "longitude";
    public static final String COLUMN_NAME = "name";
    public static final String COLUMN_CITY = "city";

    public static final String CREATE_TABLE_POI = "create table "
            + TABLE_POI + "("
            + COLUMN_ID + " integer primary key autoincrement, "
            + COLUMN_LAT + " real not null, "
            + COLUMN_LNG + " real not null, "
            + COLUMN_NAME + " text not null, "
            + COLUMN_CITY + " text not null "
            + ");";
    ...