2013-07-03 10 views
2

오류가 계속 나타나는 이유를 도와 줄 사람이 있습니까?sqlite 데이터베이스 파일을 열 수 없습니다.

내 활동에 회 전자와 EditText가 있습니다. 해당 활동에서 이미 android.database.sqlite.SQLiteCantOpenDatabaseException : 데이터베이스 파일을 열 수 없습니다. 내가 저장 버튼을 누를 때마다, 위젯의 값이 저장되지 않은, 그러나

07-03 16:43:03.156: E/SqliteDatabaseCpp(13449): sqlite3_open_v2("/data/data/ph.com.unilab.ireport/databases/lamp_db.sqlite", &handle, 1, NULL) failed 
07-03 16:43:03.164: E/SQLiteDatabase(13449): Failed to open the database. closing it. 
07-03 16:43:03.164: E/SQLiteDatabase(13449): android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file 
07-03 16:43:03.164: E/SQLiteDatabase(13449): at android.database.sqlite.SQLiteDatabase.dbopen(Native Method) 
07-03 16:43:03.164: E/SQLiteDatabase(13449): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1123) 
07-03 16:43:03.164: E/SQLiteDatabase(13449): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1074) 
07-03 16:43:03.164: E/SQLiteDatabase(13449): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1050) 
07-03 16:43:03.164: E/SQLiteDatabase(13449): at ph.com.unilab.ireport.DatabaseHandler.checkDataBase(DatabaseHandler.java:81) 
07-03 16:43:03.164: E/SQLiteDatabase(13449): at ph.com.unilab.ireport.DatabaseHandler.createDB(DatabaseHandler.java:49) 
07-03 16:43:03.164: E/SQLiteDatabase(13449): at ph.com.unilab.ireport.S_9th_ISubmit.onCreate(S_9th_ISubmit.java:56) 
07-03 16:43:03.164: E/SQLiteDatabase(13449): at android.app.Activity.performCreate(Activity.java:4465) 
07-03 16:43:03.164: E/SQLiteDatabase(13449): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1053) 
07-03 16:43:03.164: E/SQLiteDatabase(13449): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1934) 
07-03 16:43:03.164: E/SQLiteDatabase(13449): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995) 
07-03 16:43:03.164: E/SQLiteDatabase(13449): at android.app.ActivityThread.access$600(ActivityThread.java:128) 
07-03 16:43:03.164: E/SQLiteDatabase(13449): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161) 
07-03 16:43:03.164: E/SQLiteDatabase(13449): at android.os.Handler.dispatchMessage(Handler.java:99) 
07-03 16:43:03.164: E/SQLiteDatabase(13449): at android.os.Looper.loop(Looper.java:137) 
07-03 16:43:03.164: E/SQLiteDatabase(13449): at android.app.ActivityThread.main(ActivityThread.java:4514) 

내가 회에 데이터베이스에서 데이터를 채울 수 있지만, 다음은

로그 캣의 말씀입니다 데이터베이스에.

databaseHandler.java

public class DatabaseHandler extends SQLiteOpenHelper { 
static final String TAG = "LAMP"; 
public SQLiteDatabase db; 
private final Context myContext;  
private static DatabaseHandler dbHandler; 


public DatabaseHandler(Context context) { 
    super(context, Constants.DB_NAME, null, Constants.DB_VERSION); 
    this.myContext = context; 
} 

public static DatabaseHandler getInstance(Context context) { 
     if(dbHandler == null) { 
     dbHandler = new DatabaseHandler(context); 
     } 
    return dbHandler; 
    } 


    public void createDB() throws IOException{ 
    boolean dbExist = checkDataBase(); 
    if(dbExist) { 
      //do nothing - database already exist 
    }else{ 
     this.getReadableDatabase(); 
     try { 
      copyDataBase(); 
     } catch (IOException e) { 
      throw new Error("Error copying database"); 
     } 
    } 
} 


    private boolean checkDataBase(){ 
    SQLiteDatabase checkDB = null; 
    try{ 
      String myPath =Constants.DB_PATH + Constants.DB_NAME; 
     checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 
    }catch(SQLiteException e){ 
      //database does't exist yet.  
    } 

     if(checkDB != null){ 

      checkDB.close(); 

     } 

     return checkDB != null ? true : false; 
    } 


    private void copyDataBase() throws IOException{ 

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

     // Path to the just created empty db 
     String outFileName = Constants.DB_PATH + Constants.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 void openDataBase() throws SQLException{ 

     //Open the database 
     String myPath = Constants.DB_PATH + Constants.DB_NAME; 
     db = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 

    } 

    @Override 
    public synchronized void close() { 

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

      super.close(); 

    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

    } 

가이 오류를 해결하는 데 도움이 수 있습니까?

this.getReadableDatabase(); 

당신은이 방법을 쓸 수 있습니다 :

답변

3

,에서 onCreate에서 데이터베이스를 작성,

this.getWritableDatabase();
대신
this.getReadableDatabase();

의 사용. OnCreate는 데이터베이스가 처음 생성 될 때 호출됩니다. 이것은 테이블의 생성과 테이블의 초기 채우기가 발생해야하는 곳입니다. 예를 들어

@Override 
public void onCreate(SQLiteDatabase db) { 
    db.execSQL("CREATE TABLE IF NOT EXISTS " + tableName + "(" + id 
      + " INTEGER PRIMARY KEY AUTOINCREMENT, " + startDate 
      + " LONG , " + url + " TEXT, " + title + " TEXT, " + endDate 
      + " LONG, " + sentToCloud + " INTEGER DEFAULT 0);"); 

} 
1

는이 라인을 가지고있다. 이것에

변경이 : dasdasd 말했듯이

this.getWritableDatabase(); 
+0

아무 일도하지 ... – androidBoomer

관련 문제