2012-05-10 3 views
3

Android 애플리케이션에서 SQLite DB에 액세스하는 데 문제가 있습니다. SQLiteOpenHelper 인스턴스를 포함하는 응용 프로그램 클래스를 만들었지 만 다른 작업에서 DB를 열려고 할 때마다 충돌이 발생합니다. 여기 Android에서 데이터베이스 문제가있는 애플리케이션 클래스

public class GlobalVariables extends Application { 

    private LocationsData locations; 

    public void onCreate(Context context) { 
      locations = new LocationsData(context); 
    } 

    public LocationsData getLocations() { 
      return locations; 
    } 
} 

내 SQLiteOpenHelper 클래스입니다 : 여기

내 응용 프로그램 클래스입니다

public class LocationsData extends SQLiteOpenHelper{ 
private static final String DATABASE_NAME = "locations.db"; 
private static final int DATABASE_VERSION = 1; 

public static final String TABLE_LOCATIONS = "locations"; 
public static final String COLUMN_ID = "_id"; 
public static final String COLUMN_NICKNAME = "nickname"; 

private static final String DATABASE_CREATE = "create table " 
     + TABLE_LOCATIONS + "(" + COLUMN_ID 
     + " integer primary key autoincrement, " + COLUMN_NICKNAME 
     + " text not null);"; 

public LocationsData(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    db.execSQL(DATABASE_CREATE); 

} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_LOCATIONS); 
    onCreate(db); 

} 

}

그리고 난 내가 얻을 같은 다른 활동에 DB 년대에 액세스하려고 할 때 오류 :

@Override 
    public void onResume() 
    { 
     locationsData=((GlobalVariables)getApplication()).getLocations(); 
     SQLiteDatabase db = locationsData.getReadableDatabase(); 
     super.onResume(); 
    } 

도움이 필요하십니까? 고맙습니다!

Log Cat: 
05-10 02:00:50.146: D/AndroidRuntime(532): Shutting down VM 
05-10 02:00:50.146: W/dalvikvm(532): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
05-10 02:00:50.179: E/AndroidRuntime(532): FATAL EXCEPTION: main 
05-10 02:00:50.179: E/AndroidRuntime(532): java.lang.RuntimeException: Unable to resume activity {com.John.seniorDesign/com.John.seniorDesign.LocationsTabActivity}: java.lang.NullPointerException 
05-10 02:00:50.179: E/AndroidRuntime(532): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2120) 
05-10 02:00:50.179: E/AndroidRuntime(532): at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:138) 
05-10 02:00:50.179: E/AndroidRuntime(532): at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339) 
05-10 02:00:50.179: E/AndroidRuntime(532): at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:654) 
05-10 02:00:50.179: E/AndroidRuntime(532): at android.widget.TabHost.setCurrentTab(TabHost.java:326) 
05-10 02:00:50.179: E/AndroidRuntime(532): at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:132) 
05-10 02:00:50.179: E/AndroidRuntime(532): at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:456) 
05-10 02:00:50.179: E/AndroidRuntime(532): at android.view.View.performClick(View.java:2485) 
05-10 02:00:50.179: E/AndroidRuntime(532): at android.view.View$PerformClick.run(View.java:9080) 
05-10 02:00:50.179: E/AndroidRuntime(532): at android.os.Handler.handleCallback(Handler.java:587) 
05-10 02:00:50.179: E/AndroidRuntime(532): at android.os.Handler.dispatchMessage(Handler.java:92) 
05-10 02:00:50.179: E/AndroidRuntime(532): at android.os.Looper.loop(Looper.java:130) 
05-10 02:00:50.179: E/AndroidRuntime(532): at android.app.ActivityThread.main(ActivityThread.java:3683) 
05-10 02:00:50.179: E/AndroidRuntime(532): at java.lang.reflect.Method.invokeNative(Native Method) 
05-10 02:00:50.179: E/AndroidRuntime(532): at java.lang.reflect.Method.invoke(Method.java:507) 
05-10 02:00:50.179: E/AndroidRuntime(532): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
05-10 02:00:50.179: E/AndroidRuntime(532): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
05-10 02:00:50.179: E/AndroidRuntime(532): at dalvik.system.NativeStart.main(Native Method) 
05-10 02:00:50.179: E/AndroidRuntime(532): Caused by: java.lang.NullPointerException 
05-10 02:00:50.179: E/AndroidRuntime(532): at com.John.seniorDesign.LocationsTabActivity.onResume(LocationsTabActivity.java:75) 
05-10 02:00:50.179: E/AndroidRuntime(532): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1150) 
05-10 02:00:50.179: E/AndroidRuntime(532): at android.app.Activity.performResume(Activity.java:3832) 
05-10 02:00:50.179: E/AndroidRuntime(532): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2110) 
05-10 02:00:50.179: E/AndroidRuntime(532): ... 17 more 
+0

logcat에서 오류의 스택 추적을 게시하십시오. – superfell

+0

내가 옳지 않은 GlobalVariables 클래스에서 onCreate() 호출의 컨텍스트와 관련이있을 수 있다고 생각합니다. 하지만 확실하지 않습니다 ... – Seuby

+1

LocationsTabActivity.onResume에 대한 코드를 게시하십시오. – superfell

답변

4

에서 GlobalVariables는 새 LocationsData에서 getApplicationContext()로 컨텍스트를 변경하고 onCreate에서 컨텍스트를 제거합니다.이 서명은 존재하지 않습니다.

편집 :

public class GlobalVariables extends Application { 

    private LocationsData locations; 

    @Override 
    public void onCreate() { 
      locations = new LocationsData(getApplicationContext()); 
    } 

    public LocationsData getLocations() { 
      return locations; 
    } 
} 
+0

@ 오버라이드가이를 포착합니다. – superfell

+0

물론, 내 대답에 그것을 추가했습니다. 감사. –

0

확실하지 않음 원인은 무엇인가, 그러나 여기에서 나는 보통 내 DB 열기/닫기 기능을 구현하는 방법은 다음과 같습니다 내 DB 클래스에서

:

public GroceryDB(Context ctx) { 
    this.mCtx = ctx; 
} 

public GroceryDB open() throws SQLException { 
    mDBHelper = new DBHelper(mCtx); 
    mDb = mDBHelper.getWritableDatabase(); 
    return this; 
} 

public void close() { 
    mDBHelper.close(); 
} 

다음과 같이 다른 클래스에서 호출합니다.

mDbHelper = new GroceryDB(getActivity()); 
    mDbHelper.open(); 

희망이 도움이됩니다.

0

응용 프로그램의 수명주기 동안 항상 단일 데이터베이스 인스턴스를 다루는 것이 좋습니다. 비슷한 질문으로 answer을 확인하십시오. 애플리케이션에서 데이터베이스를 올바르게 열고 닫는 방법에 대한 몇 가지 예를 보여줍니다.

관련 문제