이것은 기본적으로 첫 번째 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/";
어떤 도움들?
에서 데이터베이스 파일을 삭제 중 한 가지 방법으로에서 onCreate 작업을 매번 얻을 수 그래서 기본적 아이디어는 활동에서 getReadableDatabase()를 호출하는 것입니다. 또한 활동 클래스의 쿼리도 전달해야합니까? – abhig10
다소 많았지 만, 필자는 대답에서 말했듯이 일반적으로 OpenHelper 클래스를 정의하고 getWritableDatabase()를 검색하고 모든 쿼리를 작성하는 DataManager 클래스를 정의합니다. DataManager의 인스턴스를 내 onCreate 메소드의 애플리케이션 인스턴스에 저장하므로 모든 액티비티 (동시성 문제를 피하기위한 최선의 방법)가 공유 할 수 있습니다. 액티비티를 통해 애플리케이션 인스턴스에서 DataManager 인스턴스를 가져온 다음 메서드를 통해 쿼리를 작성합니다. DataManager 만 OpenHelper를 사용합니다. – thelawnmowerman
내 오류가 해결 된 것 같지만 이제는 (5) 데이터베이스가 잠겼습니다.라는 또 다른 오류가 나타납니다. 왜 그런가? – abhig10