2012-11-16 3 views
2
난 내 데이터베이스 장치에 자산에서 복사 한 그러나 여기 데이터베이스 코드에서 데이터를 읽을 수 없습니다

안드로이드 데이터베이스를 읽을 수 없습니다

package ta.ex; 

import java.io.IOException; 

import android.app.Activity; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.os.Bundle; 
import android.widget.ListView; 
import android.widget.SimpleCursorAdapter; 

public class MainActivity extends Activity { 
    /** Called when the activity is first created. */ 
    MyDatabase mydb; 
    ListView listtema; 
    SQLiteDatabase db; 
    Cursor cursor; 
    SimpleCursorAdapter adapter; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mydb = new MyDatabase(this); 
     try { 
      mydb.createDataBase(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     db = db.openDatabase("data/data/ta.ex/databases/ensiklopedia.sqlite", null, db.OPEN_READONLY); 

     listtema = (ListView)findViewById(R.id.listTema); 
     String[] columns = new String[]{"_id","tema"};  
     cursor = db.query("tema", columns, null, null, null, null, null); 
     if (cursor != null){ 
      adapter = new SimpleCursorAdapter(this, 
        android.R.layout.simple_list_item_1,cursor, 
        new String[]{"tema"},new int[]{android.R.id.text1}); 
      listtema.setAdapter(adapter); 
     } 


    } 
} 

MyDatabase.java

package ta.ex; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 

import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteException; 
import android.database.sqlite.SQLiteOpenHelper; 

public class MyDatabase extends SQLiteOpenHelper{ 
    private static final String DB_PATH = "/data/data/ta.ex/databases/"; 
    private static final String DB_NAME = "ensiklopedia.sqlite"; 
    private SQLiteDatabase sqldb; 
    private final Context myContext; 


    public MyDatabase(Context context) { 
     super(context,DB_NAME,null,1); 
     // TODO Auto-generated constructor stub 
     this.myContext = context; 
    } 

    public void createDataBase() throws IOException{ 

      boolean dbExist = checkDataBase(); 

      if(dbExist){ 
       //do nothing - database already exist 
      }else{ 

       //By calling this method and empty database will be created into the default system path 
        //of your application so we are gonna be able to overwrite that database with our database. 
       this.getReadableDatabase(); 

       try { 

        copyDataBase(); 

       } catch (IOException e) { 

        throw new Error("Error copying database"); 

       } 
      } 

     } 

     /** 
     * Check if the database already exist to avoid re-copying the file each time you open the application. 
     * @return true if it exists, false if it doesn't 
     */ 
     boolean checkDataBase(){ 

      SQLiteDatabase checkDB = null; 
      try{ 
       String myPath = DB_PATH + DB_NAME; 
       checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 
      } 
      catch(SQLiteException e){ 
       //database doesn't exist yet. 
      } 
      if(checkDB != null){ 
       checkDB.close(); 
      } 

      return checkDB != null ? true : false; 
     } 

     /** 
     * Copies your database from your local assets-folder to the just created empty database in the 
     * system folder, from where it can be accessed and handled. 
     * This is done by transfering bytestream. 
     * */ 
     private void copyDataBase() throws IOException{ 

      //Open your local db as the input stream 
      InputStream myInput = myContext.getAssets().open(DB_NAME); 

      // Path to the just created empty db 
      File outFileName = myContext.getDatabasePath(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(); 

     } 

     public boolean isDatabaseExist() { 
      File dbFile = new File(DB_PATH+DB_NAME); 
      return dbFile.exists(); 
     } 

     public void openDataBase(){ 
      //Open the database 
      String myPath = DB_PATH + DB_NAME; 
      sqldb = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); 
     } 

     @Override 
     public synchronized void close() { 

       if(sqldb != null) 
        sqldb.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 

    } 

} 

로그 고양이

내가 createDatabase를 사용할 때
11-16 19:18:12.182: ERROR/AndroidRuntime(5818): java.lang.RuntimeException: Unable to start activity ComponentInfo{ta.ex/ta.ex.MainActivity}: java.lang.NullPointerException 
11-16 19:18:12.182: ERROR/AndroidRuntime(5818):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 
11-16 19:18:12.182: ERROR/AndroidRuntime(5818):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
11-16 19:18:12.182: ERROR/AndroidRuntime(5818):  at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
11-16 19:18:12.182: ERROR/AndroidRuntime(5818):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
11-16 19:18:12.182: ERROR/AndroidRuntime(5818):  at android.os.Handler.dispatchMessage(Handler.java:99) 
11-16 19:18:12.182: ERROR/AndroidRuntime(5818):  at android.os.Looper.loop(Looper.java:123) 
11-16 19:18:12.182: ERROR/AndroidRuntime(5818):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
11-16 19:18:12.182: ERROR/AndroidRuntime(5818):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-16 19:18:12.182: ERROR/AndroidRuntime(5818):  at java.lang.reflect.Method.invoke(Method.java:521) 
11-16 19:18:12.182: ERROR/AndroidRuntime(5818):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
11-16 19:18:12.182: ERROR/AndroidRuntime(5818):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
11-16 19:18:12.182: ERROR/AndroidRuntime(5818):  at dalvik.system.NativeStart.main(Native Method) 
11-16 19:18:12.182: ERROR/AndroidRuntime(5818): Caused by: java.lang.NullPointerException 
11-16 19:18:12.182: ERROR/AndroidRuntime(5818):  at ta.ex.MainActivity.onCreate(MainActivity.java:33) 
11-16 19:18:12.182: ERROR/AndroidRuntime(5818):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
11-16 19:18:12.182: ERROR/AndroidRuntime(5818):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 

() 데이터베이스 시스템에 복사하지만 난 데이터를 열려고 할 때마다 base는 항상 java.lang.nullpointerexception을 강제로 닫습니다. 사용을 할 수

+0

데이터베이스를 응용 프로그램 내에서 자산으로 패키징하는 데 현재 코드 대신 'SQLiteAssetHelper'를 사용하십시오. https://github.com/jgilfelt/android-sqlite-asset- 도우미 – CommonsWare

+0

이 응답하여 코드를 확인 http://stackoverflow.com/questions/13329754/null-pointer-exception-when-trying-to-access-databasehelper-in-a-copied-database/13329797# 13329797 – urveshpatel50

+1

@CommonsWare 정말 고맙습니다. 이제 모든 것이 작동합니다. – user1822857

답변

3

당신은 라인에서 사용하기 전에 변수 db를 초기화하지 않았다 ..

db = db.openDatabase("data/data/ta.ex/databases/ensiklopedia.sqlite", null, db.OPEN_READONLY); 

도와주세요 :

db = SQLiteDatabase.openDatabase("data/data/ta.ex/databases/ensiklopedia.sqlite", null, db.OPEN_READONLY); 

또는 기능 openDataBase를 사용하여 :

public SQLiteDatabase openDataBase(){ 
     //Open the database 
     String myPath = DB_PATH + DB_NAME; 
     sqldb = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); 
     return sqldb; 
    } 

활동 내역 :

db = db.openDatabase("data/data/ta.ex/databases/ensiklopedia.sqlite", null, db.OPEN_READONLY); 

내가 문제를 발견
db = mydb.openDataBase(); 
1

mydb.openDataBase(); 

이 mydatabase.java 느릅 나무 반환 커서의 함수를 만듭니다 다음과 같은 라인을 사용 이상 제거합니다. mydatabase.java 클래스에 db 객체가 있습니다.

관련 문제