我正在尝试使用现有数据库并且刚才意识到我有一个非常简单的问题,尽管答案可能不那么简单:
-App称为myApp - 由于某种原因,eclipse调用包如下: package com.example.myapp;
-db称为nn.sqlite -db在资产文件夹
中但是,当我尝试打开它时,使用我认为正确的路径,我得到:
09-22 18:48:33.180: I/System.out(838): java.io.FileNotFoundException: /data/data/com.example.myApp/databases/nn
我分别尝试使用myapp而不是myApp的路径,但无济于事。
我的道路似乎错了。
我该怎么做才能解决这个问题,或者更确切地说,如何找到正确的路径?
有人暗示我应该先复制我的数据库 - 据我所知,我已经这样做了,所以这里有代码:
package com.example.myapp;
public class Helper extends SQLiteOpenHelper
{
private static String path = "/data/data/com.example.myapp/databases/";
private static String db = "nn";
private static String dbpath = path + db;
private SQLiteDatabase myDB;
private Context con;
public Helper(Context context) {
super(context, db, null, 1);
this.con = context;
}
public Context getContext(){
return this.con;
}
public void createDataBase() throws IOException{
if(!checkDataBase()){
this.getReadableDatabase();
try {
copyDataBase();
} catch (IOException e) {
System.out.println("no Database");
}
}
}
private boolean checkDataBase() {
SQLiteDatabase checkDB = null;
try{
checkDB = SQLiteDatabase.openDatabase(dbpath, null, SQLiteDatabase.OPEN_READONLY);
}catch(SQLiteException e){
}
if(checkDB != null){
checkDB.close();
return true;
} else {return false;}
}
private void copyDataBase() throws IOException {
InputStream myInput = con.getAssets().open(db);
OutputStream myOutput = new FileOutputStream(dbpath);
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer))>0){
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();
}
public void openDataBase() throws SQLException{
myDB = SQLiteDatabase.openDatabase(dbpath, null, SQLiteDatabase.OPEN_READONLY);
}
@Override
public synchronized void close() {
if(myDB != null)
myDB.close();
super.close();
}
@Override
public void onCreate(SQLiteDatabase arg0) {
// TODO Auto-generated method stub
}
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
// TODO Auto-generated method stub
}
}
是否有其他类型的复制我省略了?
答案 0 :(得分:1)
尝试InputStream input = getAssets()。open(" YourDatabase.sqlite");
答案 1 :(得分:0)
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
helper = new Helper(this);
try {
helper.createDataBase();
} catch (IOException ex) {
System.out.println("no start");
}
try {
helper.openDataBase();
} catch (SQLException sqlex) {
System.out.println("does not open");
}
}
你不用这段代码创建数据库...没有sql创建...尝试用它来解决这个问题:
class MyDatabase extends SQLiteOpenHelper {
public MyDatabase() {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = String.format("create table %s "
+ "(%s int primary key, %s text)",
TABLE_NAME,
A_IDD, A_FIELD);
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop if exist " + TABLE_NAME);
onCreate(db);
}
}
}
答案 2 :(得分:0)
我不太确定我是否应该在这里回答这个问题,因为我在这里得到了另一个问题的答案。
但是,我使用了sqliteOpenAssetHelper。 效果很好。