2013-02-05 2 views
0

이것은 기본적으로 첫 번째 Android 앱이며 내 요구 사항을 해결하기 위해 미리 채운 sqllite 데이터베이스를 사용하려고했습니다.onCreate 메소드가 DatabaseHandler에서 호출되지 않습니다. SQLiteOpenHelper를 확장합니다.

제 문제는 onCreate 함수가 호출되지 않는다는 것입니다.

나는 많은 곳에서 코드를 가져 와서이 클래스를 형성했다. android.com

import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.util.Locale; 
import java.util.Random; 

import android.content.Context; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteException; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

public class DatabaseHandler extends SQLiteOpenHelper { 

    SQLiteDatabase db; 
    private static final String TAG = "DataBaseHelper"; 
    int id = 0; 
    Random random = new Random(); 
    private SQLiteDatabase myDataBase; 
    private final Context myContext; 

    // Constructor 
    public DatabaseHandler(Context context) { 
     super(context, DefinitionContract.DATABASE_NAME, null, DefinitionContract.DATABASE_VERSION); 
     Log.d(TAG, "DatabaseHandler constructor called\n"); 
     db = getWritableDatabase(); 
     this.myContext = context; 
     //createDB(); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db){ 
     Log.d(TAG, "onCreate called\n"); 
     createDB(); 
    } 

    // Upgrading database 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     Log.d(TAG, "onUpgrade called\n"); 
     Log.w(TAG, "Upgrading DB from version " + oldVersion + " to " + 
        newVersion + ", which will destroy all old data"); 

     // Drop older table if existed 
     String sql = "DROP TABLE IF EXISTS " + DefinitionContract.CATEGORY_TABLE_NAME; 
     db.execSQL(sql); 

     sql = "DROP TABLE IF EXISTS " + DefinitionContract.CONTENTS_TABLE_NAME; 
     db.execSQL(sql); 

     // Create table again 
     onCreate(db); 
    } 

    public void createDataBase(SQLiteDatabase db) { 
     Log.d(TAG, "createDataBase called\n"); 
     createDB(); 
     db.execSQL(DefinitionContract.CREATE_CATEGORY_TABLE); 
     db.execSQL(DefinitionContract.CREATE_CONTENTS_TABLE); 
    } 

    private void createDB() { 
     Log.d(TAG, "createDB called\n"); 
     boolean dbExist = dbExists(); 
     Log.d("SQL Helper", "Condition:\n"); 
     if(!dbExist) { 
      Log.d("SQL Helper", "Condition 1\n"); 
      copyDataBase(); 
     } else if(dbExist) { 
      Log.d("SQL Helper", "Condition 2\n"); 
      copyDataBase(); 
     } 
    } 

    private boolean dbExists() { 
     Log.d(TAG, "dbExists called\n"); 
     //File dbFile = new File(DefinitionContract.DATABASE_PATH + DefinitionContract.DATABASE_NAME); 
     //return dbFile.exists(); 

     SQLiteDatabase db = null; 
     try { 
      String dbPath = DefinitionContract.DATABASE_PATH + DefinitionContract.DATABASE_NAME; 
      db = SQLiteDatabase.openDatabase(dbPath, null, SQLiteDatabase.OPEN_READWRITE); 
      db.setLocale(Locale.getDefault()); 
      db.setLockingEnabled(true); 
      db.setVersion(DefinitionContract.DATABASE_VERSION); 
     } 
     catch(SQLiteException e){ 
      Log.e("SQL Helper", "database not found"); 
     } 
     if(db != null) { 
      db.close(); 
     } 
     return db != null ? true : false; 
    } 

    private void copyDataBase() { 
     Log.d(TAG, "copyDataBase called \n"); 
     InputStream iStream = null; 
     OutputStream oStream = null; 
     String outFilePath = DefinitionContract.DATABASE_PATH + DefinitionContract.DATABASE_NAME; 
     try{ 
      iStream = myContext.getAssets().open(DefinitionContract.DATABASE_NAME_EXT); 
      oStream = new FileOutputStream(outFilePath); 
      byte[] buffer = new byte[1024]; 
      int length; 
      while((length = iStream.read(buffer))>0) { 
       oStream.write(buffer,0,length); 
      } 
      oStream.flush(); 
      oStream.close(); 
      iStream.close(); 
     } 
     catch(IOException ioe){ 
      throw new Error("Problem copying database from resource file."); 
     } 
    } 

    public void openDataBase() throws SQLException { 
     String myPath = DefinitionContract.DATABASE_PATH + DefinitionContract.DATABASE_NAME_EXT; 
     myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); 
    } 

    @Override 
    public synchronized void close() { 
     Log.d(TAG, "close called\n"); 
     if (myDataBase != null) 
      myDataBase.close(); 
     super.close(); 
    } 

    public void readDB() { 
     Log.d(TAG, "readDB called\n"); 
     String selectQuery = "SELECT * FROM " + DefinitionContract.DATABASE_ONLYNAME+"."+DefinitionContract.CATEGORY_TABLE_NAME; 
     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor cursor = db.rawQuery(selectQuery, null); 

     // looping through all rows and adding to list 
     if (cursor.moveToFirst()) { 
      do { 
       int arraySize = cursor.getColumnCount(); 
       String newlog = "arraySize=" + arraySize + "*****"; 
       for(int i = 0; i < arraySize; i++) { 
        newlog = newlog + cursor.getString(i)+ "\n"; 
       } 

       Log.d("Details: ", newlog); 
      } while (cursor.moveToNext()); 
     } 
    } 

} 

에서

http://www.androidhive.info/2011/11/android-sqlite-database-tutorial/

그리고 일부 다른

Updating prepopulated database in Android 나는 이미 구글 검색을 수행하고 그것을 해결하기 위해 시도했지만 아직 작동하지 않습니다했다.

Android SQLiteOpenHelper : onCreate() method is not called. Why?

SQLiteOpenHelper failing to call onCreate?

로그 캣의 showns 나는 dB = getWritableDatabase를 제거하면()이

후 "VM을 종료"그러나 만 "DataBaseHandler 생성자라는"및; 내 생성자에서 줄 더 작동하고 readDB() 함수가 호출되고 있음을 보여줍니다. 내 코드를 이해하는데 도움이 될

일부 정의 :

public static final String DATABASE_NAME  = "mydb.db"; 

public static final String DATABASE_NAME_EXT  = "mydb.sqllite"; 

// Database path 
public static final String DATABASE_PATH = "/data/data/com.abhishekgdotcom.collection/databases/"; 

어떤 도움들?

답변

1

글쎄, onCreate() 메서드가 응용 프로그램이 처음 실행되기 때문에 호출되기 때문에 실제 이유는 나를 위해 작동하지 않습니다. 또는 DATABASE_VERSION을 변경하면 onUpgrade이 호출되고 다시 onCreate 메서드가 호출됩니다.

나는 이것이 기본 안드로이드 작업이라고 생각합니다.

P.S 나는 데이터베이스 버전을 변경하거나 /data/data/packagename/databases/

0

동일한 클래스에서 많은 관련이없는 것들을 만들기 때문에 다른 코드 조직을 추천합니다. 일반적으로 좋은 디자인은 SQLiteHelper에서 상속받은 OpenHelper 클래스를 정의하여 데이터뱅크를 새로 만들거나 업데이트하는 것입니다. 그런 다음 다른 외부 클래스 (일반적으로 활동)에서 OpenHelper 클래스를 인스턴스화 한 다음 getWritableDatabase()를 호출하십시오. 어쩌면 버그를 쉽게 찾을 수 있습니다.

+0

에서 데이터베이스 파일을 삭제 중 한 가지 방법으로에서 onCreate 작업을 매번 얻을 수 그래서 기본적 아이디어는 활동에서 getReadableDatabase()를 호출하는 것입니다. 또한 활동 클래스의 쿼리도 전달해야합니까? – abhig10

+0

다소 많았지 만, 필자는 대답에서 말했듯이 일반적으로 OpenHelper 클래스를 정의하고 getWritableDatabase()를 검색하고 모든 쿼리를 작성하는 DataManager 클래스를 정의합니다. DataManager의 인스턴스를 내 onCreate 메소드의 애플리케이션 인스턴스에 저장하므로 모든 액티비티 (동시성 문제를 피하기위한 최선의 방법)가 공유 할 수 있습니다. 액티비티를 통해 애플리케이션 인스턴스에서 DataManager 인스턴스를 가져온 다음 메서드를 통해 쿼리를 작성합니다. DataManager 만 OpenHelper를 사용합니다. – thelawnmowerman

+0

내 오류가 해결 된 것 같지만 이제는 (5) 데이터베이스가 잠겼습니다.라는 또 다른 오류가 나타납니다. 왜 그런가? – abhig10

관련 문제