无法访问其他应用程序android创建的数据库

时间:2014-08-05 14:44:22

标签: android database sqlite

我在一个有两个应用程序的项目上工作。第一个启用记录数据库的信息,第二个使用此信息。 我对第一个没有问题但是当我尝试使用第二个访问数据库时,我有错误:

  

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) {

        }
    }

我尝试卸载应用,更改数据库版本失败。

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

首先:不要使用硬编码路径。请改用Context.getDatabasePath(String)

第二:如果您想要的数据位于另一个应用程序中,那么该应用程序需要公开一个接口,以便您跨进程边界进行通信。通常这意味着服务应用程序(具有数据的应用程序)实现ContentProviderBound Service,后者可能需要使用AIDL