Java 使用android studio打开sqlite数据库时出错
我可以知道为什么我运行此项目时出现此错误,并且设备上的应用程序不幸停止。错误为。android.database.sqlite.SQLiteCantoPendDatabaseException:未知错误(代码14):无法打开数据库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
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 "
+ ");";
...