我在一个有两个应用程序的项目上工作。第一个启用记录数据库的信息,第二个使用此信息。 我对第一个没有问题但是当我尝试使用第二个访问数据库时,我有错误:
08-05 14:22:29.545:E / AndroidRuntime(4751): 致命异议:主要 08-05 14:22:29.545:E / AndroidRuntime(4751): android.database.sqlite.SQLiteException:没有这样的表: matable(代码1):,编译时:SELECT * FROM 可配合 08-05 14:22:29.545:E / AndroidRuntime(4751): 在 android.database.sqlite.SQLiteConnection.nativePrepareStatement(母语 方法)08-05 14:22:29.545:E / AndroidRuntime(4751):at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:882) 08-05 14:22:29.545:E / AndroidRuntime(4751):...
我已设置两个清单变量android:sharedUserId="mySharedUserId"
我将我的第一个应用程序链接到我的第二个应用程序,以重用第一个应用程序的类(DataBaseHelper,DAO,...)。它与执行访问(写入或读取)数据库的代码相同。
我的DataBaseHelper.java
package com.mypackage.database;
import java.io.FileOutputStream;
public class DataBaseHelper extends SQLiteOpenHelper {
private static final String TAG = "DataBaseHelper";
private SQLiteDatabase myDataBase;
private final Context myContext;
private static int DATABASE_VERSION = 1;
private static String DATABASE_NAME = "db_devicesManager";
private String DATABASE_PATH = "/data/data/com.mypackage.myapp/databases/";
public DataBaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
Log.d(TAG, "path :"+DATABASE_PATH);
this.myContext = context;
}
public void createDataBase() throws IOException {
boolean mDataBaseExist = checkDataBase();
if(!mDataBaseExist)
{
this.getReadableDatabase();
this.close();
try
{
copyDataBase();
}
catch (IOException mIOException)
{
throw new Error("ErrorCopyingDataBase");
}
}
}
private boolean checkDataBase() {
SQLiteDatabase checkDB = null;
try{
String myPath = DATABASE_PATH + DATABASE_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
}catch(SQLiteException e){
//database does't exist yet.
}
if(checkDB != null){
checkDB.close();
}
return checkDB != null ? true : false;
}
private void copyDataBase() throws IOException {
InputStream inputStream = myContext.getAssets().open(DATABASE_NAME);
String myPath = DATABASE_PATH + DATABASE_NAME;
OutputStream outputStream = new FileOutputStream(myPath);
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, length);
}
outputStream.flush();
outputStream.close();
inputStream.close();
}
public boolean openDataBase() throws SQLException {
String myPath = DATABASE_PATH + DATABASE_NAME;
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.CREATE_IF_NECESSARY);
return myDataBase!=null;
}
@Override
public synchronized void close() {
if (myDataBase != null)
myDataBase.close();
super.close();
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase arg0, int oldVersion, int newVersion) {
}
}
我尝试卸载应用,更改数据库版本失败。
感谢您的帮助
答案 0 :(得分:2)
首先:不要使用硬编码路径。请改用Context.getDatabasePath(String)
。
第二:如果您想要的数据位于另一个应用程序中,那么该应用程序需要公开一个接口,以便您跨进程边界进行通信。通常这意味着服务应用程序(具有数据的应用程序)实现ContentProvider
或Bound Service
,后者可能需要使用AIDL