1

Android辞書アプリを作りました。「kamusJawa.sqlite」という名前のデータベースを作成し、assets フォルダーにコピーしました。このリンクのコードを試しました Android Eclipse Project の Assets フォルダーにある Own Database

これは私のデータベースマネージャークラスです:

 package com.kamusJI;

 public class DBHelper extends SQLiteOpenHelper{

private static String DBPATH = "/data/data/com.kamusJI/databases/";
private static String DBNAME = "kamusJawa.sqlite";
private SQLiteDatabase DBSQ;
private final Context KJICtx;

public DBHelper(Context context) throws IOException {
    super(context, DBNAME, null, 1);
    this.KJICtx = context;
    // TODO Auto-generated constructor stub
    boolean dbexist = cekDB();
    if (dbexist) {
        //System.out.println("Database exists");
        openDB(); 
    } else {
        System.out.println("Database doesn't exist");
            createDB();

    }
}

public void createDB() throws IOException{
    boolean dbExist = cekDB();
    if(!dbExist){
        this.getReadableDatabase();
        try{
            salinDB();
        }catch (IOException e){
            throw new Error("Gagal menyalin database");
        }
    }
}
 boolean cekDB() {
    //SQLiteDatabase cekDatabase = null;
 boolean cekdb = false;
    try{
    String path = DBPATH + DBNAME;
    File dbfile = new File(path);
    //cekDatabase = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);
    cekdb = dbfile.exists();
    }catch(SQLException e){
        System.out.println("Database tidak ada");
    }

    return cekdb;
    //return cekDatabase !=null ? true : false;
} 

private void salinDB() throws IOException{
    AssetManager AM = KJICtx.getAssets();
    File DbFile = new File(DBPATH+DBNAME);
    InputStream in = KJICtx.getAssets().open(DBNAME);
    //OutputStream out = new FileOutputStream(DbFile);
    OutputStream out = new FileOutputStream("/data/data/com.kamusJI/databases/kamusJawa.sqlite");
    DbFile.createNewFile();
    byte[] b = new byte[1024];
    int i, r;
    String[] Files = AM.list("");
    Arrays.sort(Files);

    i= 1;
    String fdb = String.format("kamusJawa.db.00%d", i);
    while(Arrays.binarySearch(Files, fdb)>=0){
        //InputStream in = AM.open(fdb);
        while(( r = in.read(b))>0)
            out.write(b,0,r);
        in.close();
        i++;
        fdb = String.format("kamusJawa.db.00%d", i);
    }
    out.flush();
    out.close();
}

public void openDB() throws SQLException{
    String path = DBPATH+DBNAME;
    DBSQ = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);
}

public synchronized void close(){
    if(DBSQ !=null)
        DBSQ.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

}

}

これが私のメインクラスです:

package com.kamusJI;


public class KJI extends ListActivity {
private KJI this_class = this;
String[] Menu = {"Basa Jawa", "Bahasa Indonesia", "Tambah Data"};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    setListAdapter(new ArrayAdapter<String>(this, R.layout.row, R.id.Cari, Menu));
    ListView lv = getListView();
    lv.setTextFilterEnabled(false);

    /* Defines On Item Click callback method */
    lv.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            Intent action = null;
            switch(position) {
                case 0:
                case 1:
                    action = new Intent(getApplicationContext(), Cari.class);
                    action.putExtra("MODE", position);
                    break;
                case 2:
                    action = new Intent(getApplicationContext(), Tambah.class);
                    action.putExtra("MODE", position);
                    break;
                case 3:
                    finish();
                    return;
            }
            startActivity(action);
            Toast.makeText(getApplicationContext(), ((TextView) view).getText(), Toast.LENGTH_SHORT).show();


        }
    });
}

public void InitDatabase() {
    AsyncTask<String, Void, String> InitDB = new AsyncTask<String, Void, String>() {
        Dialog progress = null;
        String msg;
        DBHelper dbhelper;

        @Override
        protected void onPreExecute() {
            try {
                dbhelper = new DBHelper(this_class);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            if (!dbhelper.cekDB())
            progress = ProgressDialog.show(this_class, "", "Installing Database.\nPlease wait.");
            super.onPreExecute();
        }

        @Override
        protected String doInBackground(String... params) {
            try {
                dbhelper.createDB();
                msg = "Database successfully installed.";
            } catch (IOException ioe) {
                msg = "Database installation failed.";
            }
            return msg;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            if (progress!=null) {
                progress.dismiss();
                Toast.makeText(getApplicationContext(), result, Toast.LENGTH_SHORT).show();
            }
        }
    };
    InitDB.execute(new String());
   }
}

アプリケーションを実行してファイル エクスプローラーに移動すると、data/data/com.kamusJI/databases が見つかりません。どうしてそんなことができるの?

4

2 に答える 2

0

パスを読み取るには、ルート アクセスなどの特別なアクセス許可が必要です。

/data/data /com.package/databases

于 2016-12-01T22:12:51.480 に答える