Vấn đề copy file từ asset folder vào bộ nhớ


Từ: 19:28 09/12/2012
Bài: 1
Cảm ơn: 1
Thích: 0

Chào mọi người, mình đang làm một đề tài về Android mà trong đó có vấn đề là copy file  sqlite database từ asset folder vào bộ nhớ để tiện cho việc truy xuất dữ liệu. Khi mình thực hiện như ở dưới thì nó luôn luôn bị báo lỗi Filenotfound exception. Mà chắc chắn luôn là file database đã ở trong asset folder

Class làm việc với database như sau:

public class MyDatabase extends SQLiteOpenHelper{
private static String DB_PATH = "/data/data/com.hanoisbus/databases/";

private static String DB_NAME = "Database";

public SQLiteDatabase myDataBase;

private final Context myContext;

public MyDatabase(Context context) {
     super(context, DB_NAME, null, 1);
     this.myContext = context;
     openDataBase();
}   

private boolean checkDataBase(){

    SQLiteDatabase checkDB = null;

    try{
        String myPath = DB_PATH + DB_NAME;
        checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
    }catch(SQLiteException e){
        e.printStackTrace();
    }

    if(checkDB != null){
        checkDB.close();
    }

    return checkDB != null ? true : false;
}

/**
  * Copy database từ local assets-folder vào system folder, nơi mà nó có thể truy cập và khai thác
  * Thực hiện bằng cách sử dụng các stream
  * */

private void copyDataBase() throws IOException{
    try{
        File f = new File(DB_PATH + DB_NAME);
        if(!f.exists()){
            Log.v("TAG","File Not Exist");
             //Open your local db as the input stream
            InputStream myInput = myContext.getAssets().open(DB_NAME);

            // Path to the just created empty db
            String outFileName = DB_PATH + DB_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();
        }
    }catch(IOException e){
        e.printStackTrace();
    }
}

public void openDataBase() throws SQLException{
    if(checkDataBase() == false)
        try {
            copyDataBase();
        } catch (IOException e) {

        }

    String myPath = DB_PATH + DB_NAME;
    myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

}

@Override
public synchronized void close() {

    if(myDataBase != null)
        myDataBase.close();

    super.close();

}

@Override
public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub

}

Code xử lý trong Fragment có chứa thành phần cần tương tác với database như sau:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.tuyen, container,false);
    arr = new ArrayList<Tuyen>();
    md = new MyDatabase(getActivity().getApplicationContext());
    fetchAllTuyen();

    arrayAdapter = new MyTuyenListViewAdapter(getActivity(), R.layout.mylisttuyen, arr);
    setListAdapter(arrayAdapter);

    arrayAdapter.notifyDataSetChanged();

    return view;
}

File manifest.xml như sau:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.hanoisbus"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="4"
    android:targetSdkVersion="10" />

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <uses-library android:name="com.google.android.maps" />

    <activity
        android:name=".SplashScreen">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="com.android.splashscreen.MainActivity" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
    <activity android:name=".dinhvi.MyMapActivity" />
    <activity android:name=".tuyen.DetailsTuyen"/>
    <activity android:name=".diemdung.DetailsDD"/>
</application>

Logcat báo lại như sau:

12-09 13:41:38.465: E/global(601): Deprecated Thread methods are not supported.
12-09 13:41:38.465: E/global(601): java.lang.UnsupportedOperationException
12-09 13:41:38.465: E/global(601):  at java.lang.VMThread.stop(VMThread.java:85)
12-09 13:41:38.465: E/global(601):  at java.lang.Thread.stop(Thread.java:1280)
12-09 13:41:38.465: E/global(601):  at java.lang.Thread.stop(Thread.java:1247)
12-09 13:41:38.465: E/global(601):  at com.hanoisbus.SplashScreen$1.run(SplashScreen.java:35)
12-09 13:41:38.735: D/dalvikvm(601): GC_EXTERNAL_ALLOC freed 100K, 49% free 2786K/5379K, external 959K/1038K, paused 66ms
12-09 13:41:38.805: I/Database(601): sqlite returned: error code = 14, msg = cannot open file at source line 25467
12-09 13:41:38.805: E/Database(601): sqlite3_open_v2("/data/data/com.hanoisbus/databases/Database.db", &handle, 1, NULL) failed
12-09 13:41:38.816: W/System.err(601): android.database.sqlite.SQLiteException: unable to open database file
12-09 13:41:38.825: W/System.err(601):  at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
12-09 13:41:38.836: W/System.err(601):  at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1849)
12-09 13:41:38.836: W/System.err(601):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820)
12-09 13:41:38.836: W/System.err(601):  at com.hanoisbus.MyDatabase.checkDataBase(MyDatabase.java:37)
12-09 13:41:38.836: W/System.err(601):  at com.hanoisbus.MyDatabase.openDataBase(MyDatabase.java:89)
12-09 13:41:38.836: W/System.err(601):  at com.hanoisbus.MyDatabase.<init>(MyDatabase.java:28)
12-09 13:41:38.845: W/System.err(601):  at com.hanoisbus.tuyen.Tuyenfragment.onCreateView(Tuyenfragment.java:52)
12-09 13:41:38.845: W/System.err(601):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:870)
12-09 13:41:38.845: W/System.err(601):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080)
12-09 13:41:38.845: W/System.err(601):  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622)
12-09 13:41:38.855: W/System.err(601):  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416)
12-09 13:41:38.855: W/System.err(601):  at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:431)
12-09 13:41:38.855: W/System.err(601):  at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:139)
12-09 13:41:38.855: W/System.err(601):  at android.support.v4.view.ViewPager.populate(ViewPager.java:804)
12-09 13:41:38.855: W/System.err(601):  at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1016)
12-09 13:41:38.855: W/System.err(601):  at android.view.View.measure(View.java:8313)
12-09 13:41:38.855: W/System.err(601):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:531)
12-09 13:41:38.855: W/System.err(601):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
12-09 13:41:38.855: W/System.err(601):  at android.view.View.measure(View.java:8313)
12-09 13:41:38.865: W/System.err(601):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
12-09 13:41:38.865: W/System.err(601):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
12-09 13:41:38.865: W/System.err(601):  at android.view.View.measure(View.java:8313)
12-09 13:41:38.865: W/System.err(601):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:531)
12-09 13:41:38.865: W/System.err(601):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
12-09 13:41:38.865: W/System.err(601):  at android.view.View.measure(View.java:8313)
12-09 13:41:38.865: W/System.err(601):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
12-09 13:41:38.876: W/System.err(601):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
12-09 13:41:38.876: W/System.err(601):  at android.view.View.measure(View.java:8313)
12-09 13:41:38.876: W/System.err(601):  at android.view.ViewRoot.performTraversals(ViewRoot.java:839)
12-09 13:41:38.885: W/System.err(601):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
12-09 13:41:38.885: W/System.err(601):  at android.os.Handler.dispatchMessage(Handler.java:99)
12-09 13:41:38.885: W/System.err(601):  at android.os.Looper.loop(Looper.java:130)
12-09 13:41:38.885: W/System.err(601):  at android.app.ActivityThread.main(ActivityThread.java:3683)
12-09 13:41:38.885: W/System.err(601):  at java.lang.reflect.Method.invokeNative(Native Method)
12-09 13:41:38.885: W/System.err(601):  at java.lang.reflect.Method.invoke(Method.java:507)
12-09 13:41:38.885: W/System.err(601):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
12-09 13:41:38.885: W/System.err(601):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
12-09 13:41:38.885: W/System.err(601):  at dalvik.system.NativeStart.main(Native Method)
12-09 13:41:38.895: V/TAG(601): File Not Exist
12-09 13:41:38.895: D/szipinf(601): Initializing inflate state
12-09 13:41:38.905: W/System.err(601): java.io.FileNotFoundException: /data/data/com.hanoisbus/databases/Database.db (No such file or directory)
12-09 13:41:38.915: W/System.err(601):  at org.apache.harmony.luni.platform.OSFileSystem.open(Native Method)
12-09 13:41:38.915: W/System.err(601):  at dalvik.system.BlockGuard$WrappedFileSystem.open(BlockGuard.java:232)
12-09 13:41:38.925: W/System.err(601):  at java.io.FileOutputStream.<init>(FileOutputStream.java:94)
12-09 13:41:38.925: W/System.err(601):  at com.hanoisbus.MyDatabase.copyDataBase(MyDatabase.java:68)
12-09 13:41:38.925: W/System.err(601):  at com.hanoisbus.MyDatabase.openDataBase(MyDatabase.java:91)
12-09 13:41:38.925: W/System.err(601):  at com.hanoisbus.MyDatabase.<init>(MyDatabase.java:28)
12-09 13:41:38.925: W/System.err(601):  at com.hanoisbus.tuyen.Tuyenfragment.onCreateView(Tuyenfragment.java:52)
12-09 13:41:38.925: W/System.err(601):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:870)
12-09 13:41:38.925: W/System.err(601):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080)
12-09 13:41:38.935: W/System.err(601):  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622)
12-09 13:41:38.935: W/System.err(601):  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416)
12-09 13:41:38.945: W/System.err(601):  at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:431)
12-09 13:41:38.955: W/System.err(601):  at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:139)
12-09 13:41:38.955: W/System.err(601):  at android.support.v4.view.ViewPager.populate(ViewPager.java:804)
12-09 13:41:38.955: W/System.err(601):  at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1016)
12-09 13:41:38.955: W/System.err(601):  at android.view.View.measure(View.java:8313)
12-09 13:41:38.955: W/System.err(601):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:531)
12-09 13:41:38.955: W/System.err(601):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
12-09 13:41:38.955: W/System.err(601):  at android.view.View.measure(View.java:8313)
12-09 13:41:38.955: W/System.err(601):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
12-09 13:41:38.965: W/System.err(601):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
12-09 13:41:38.965: W/System.err(601):  at android.view.View.measure(View.java:8313)
12-09 13:41:38.965: W/System.err(601):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:531)
12-09 13:41:38.965: W/System.err(601):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
12-09 13:41:38.986: W/System.err(601):  at android.view.View.measure(View.java:8313)
12-09 13:41:38.986: W/System.err(601):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
12-09 13:41:38.986: W/System.err(601):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
12-09 13:41:38.986: W/System.err(601):  at android.view.View.measure(View.java:8313)
12-09 13:41:38.986: W/System.err(601):  at android.view.ViewRoot.performTraversals(ViewRoot.java:839)
12-09 13:41:38.986: W/System.err(601):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
12-09 13:41:38.995: W/System.err(601):  at android.os.Handler.dispatchMessage(Handler.java:99)
12-09 13:41:38.995: W/System.err(601):  at android.os.Looper.loop(Looper.java:130)
12-09 13:41:38.995: W/System.err(601):  at android.app.ActivityThread.main(ActivityThread.java:3683)
12-09 13:41:38.995: W/System.err(601):  at java.lang.reflect.Method.invokeNative(Native Method)
12-09 13:41:38.995: W/System.err(601):  at java.lang.reflect.Method.invoke(Method.java:507)
12-09 13:41:39.005: W/System.err(601):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
12-09 13:41:39.005: W/System.err(601):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
12-09 13:41:39.005: W/System.err(601):  at dalvik.system.NativeStart.main(Native Method)
12-09 13:41:39.005: I/Database(601): sqlite returned: error code = 14, msg = cannot open file at source line 25467
12-09 13:41:39.005: E/Database(601): sqlite3_open_v2("/data/data/com.hanoisbus/databases/Database.db", &handle, 1, NULL) failed
12-09 13:41:39.016: D/AndroidRuntime(601): Shutting down VM
12-09 13:41:39.016: W/dalvikvm(601): threadid=1: thread exiting with uncaught exception (group=0x40015560)
12-09 13:41:39.055: E/AndroidRuntime(601): FATAL EXCEPTION: main
12-09 13:41:39.055: E/AndroidRuntime(601): android.database.sqlite.SQLiteException: unable to open database file
12-09 13:41:39.055: E/AndroidRuntime(601):  at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
12-09 13:41:39.055: E/AndroidRuntime(601):  at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1849)
12-09 13:41:39.055: E/AndroidRuntime(601):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820)
12-09 13:41:39.055: E/AndroidRuntime(601):  at com.hanoisbus.MyDatabase.openDataBase(MyDatabase.java:97)
12-09 13:41:39.055: E/AndroidRuntime(601):  at com.hanoisbus.MyDatabase.<init>(MyDatabase.java:28)
12-09 13:41:39.055: E/AndroidRuntime(601):  at com.hanoisbus.tuyen.Tuyenfragment.onCreateView(Tuyenfragment.java:52)
12-09 13:41:39.055: E/AndroidRuntime(601):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:870)
12-09 13:41:39.055: E/AndroidRuntime(601):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080)
12-09 13:41:39.055: E/AndroidRuntime(601):  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622)
12-09 13:41:39.055: E/AndroidRuntime(601):  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416)
12-09 13:41:39.055: E/AndroidRuntime(601):  at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:431)
12-09 13:41:39.055: E/AndroidRuntime(601):  at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:139)
12-09 13:41:39.055: E/AndroidRuntime(601):  at android.support.v4.view.ViewPager.populate(ViewPager.java:804)
12-09 13:41:39.055: E/AndroidRuntime(601):  at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1016)
12-09 13:41:39.055: E/AndroidRuntime(601):  at android.view.View.measure(View.java:8313)
12-09 13:41:39.055: E/AndroidRuntime(601):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:531)
12-09 13:41:39.055: E/AndroidRuntime(601):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
12-09 13:41:39.055: E/AndroidRuntime(601):  at android.view.View.measure(View.java:8313)
12-09 13:41:39.055: E/AndroidRuntime(601):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
12-09 13:41:39.055: E/AndroidRuntime(601):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
12-09 13:41:39.055: E/AndroidRuntime(601):  at android.view.View.measure(View.java:8313)
12-09 13:41:39.055: E/AndroidRuntime(601):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:531)
12-09 13:41:39.055: E/AndroidRuntime(601):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
12-09 13:41:39.055: E/AndroidRuntime(601):  at android.view.View.measure(View.java:8313)
12-09 13:41:39.055: E/AndroidRuntime(601):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
12-09 13:41:39.055: E/AndroidRuntime(601):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
12-09 13:41:39.055: E/AndroidRuntime(601):  at android.view.View.measure(View.java:8313)
12-09 13:41:39.055: E/AndroidRuntime(601):  at android.view.ViewRoot.performTraversals(ViewRoot.java:839)
12-09 13:41:39.055: E/AndroidRuntime(601):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
12-09 13:41:39.055: E/AndroidRuntime(601):  at android.os.Handler.dispatchMessage(Handler.java:99)
12-09 13:41:39.055: E/AndroidRuntime(601):  at android.os.Looper.loop(Looper.java:130)
12-09 13:41:39.055: E/AndroidRuntime(601):  at android.app.ActivityThread.main(ActivityThread.java:3683)
12-09 13:41:39.055: E/AndroidRuntime(601):  at java.lang.reflect.Method.invokeNative(Native Method)
12-09 13:41:39.055: E/AndroidRuntime(601):  at java.lang.reflect.Method.invoke(Method.java:507)
12-09 13:41:39.055: E/AndroidRuntime(601):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
12-09 13:41:39.055: E/AndroidRuntime(601):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
12-09 13:41:39.055: E/AndroidRuntime(601):  at dalvik.system.NativeStart.main(Native Method)

File database chỉ có 86KB. Hình như là nó bị chặn không đủ quyền deẻ truy cập vào asset folder hoặc ko đủ quyền để truy cập vào đường dẫn vào data của application trong máy nên mới bị vậy.

Mọi người gợi ý cho mình cách để khắc phục nhé. Xin cám ơn !

Label
Từ: 10:32 14/06/2012
Bài: 112
Cảm ơn: 124
Thích: 18

Bạn vào application -> manage application -> xóa app này đi , cài lại bạn nhé.

ngoài ra mình nhìn thấy 1 lỗi

 

12-09 13:41:38.465: E/global(601):  at java.lang.VMThread.stop(VMThread.java:85)
12-09 13:41:38.465: E/global(601):  at java.lang.Thread.stop(Thread.java:1280)
12-09 13:41:38.465: E/global(601):  at java.lang.Thread.stop(Thread.java:1247)
12-09 13:41:38.465: E/global(601):  at com.hanoisbus.SplashScreen$1.run(SplashScreen.java:35)

Có vẻ như splahscreen dòng 35 của bạn thread gặp trục trặc thì phải