2014-12-18 3 views
0

Google의 턴 기반 멀티 플레이어 API를 사용하고 있습니다. 차례 데이터 클래스에서 바이트 배열의 다음 플레이어로 전달해야하는 정보를 넣으려면 내 sqlite 데이터베이스에 액세스하려고합니다. 여기 턴 기반 멀티 플레이어 클래스에서 데이터베이스에 액세스 할 때 문제가 발생했습니다.

public class BattleTurnData extends Activity 
{ 

public static final String TAG = "EBTurn"; 

public String gameData = ""; 
public int turnCounter; 
public static Context passedContext; 

public BattleTurnData(Context context) 
{ 
    passedContext = context; 
} 

// This is the byte array we will write out to the TBMP API. 
public byte[] persist() 
{ 
    //SharedPreferences prefs = getSharedPreferences("Buildings", MODE_PRIVATE); 
    Database data = new Database(this); 
    data.open(); 
    //int colonyHutOneID = prefs.getInt("NewColonyHutOne", 0); 
    int colonyHutOneLevel = data.getColonyHutOneLevel(); 
    int colonyHutOneHealth = data.getColonyHutOneHealth(); 
    int colonyHutTwoLevel = data.getColonyHutTwoLevel(); 
    int colonyHutThreeLevel = data.getColonyHutThreeLevel(); 
    int colonyHutFourLevel = data.getColonyHutFourLevel(); 
    int colonyHutFiveLevel = data.getColonyHutFiveLevel(); 
    data.close(); 

    JSONObject retVal = new JSONObject(); 

    try { 
     retVal.put("data", gameData);//colonyHutOneID + colonyHutOneLevel + colonyHutOneHealth + colonyHutTwoLevel); 
     retVal.put("turnCounter", turnCounter); 

    } catch (JSONException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    String st = retVal.toString(); 

    Log.d(TAG, "==== PERSISTING\n" + st); 

    return st.getBytes(Charset.forName("UTF-16")); 
} 

// Creates a new instance of BattleTurn. 
static public BattleTurnData unpersist(byte[] byteArray) { 

    if (byteArray == null) { 
     Log.d(TAG, "Empty array---possible bug."); 
     return new BattleTurnData(passedContext); 
    } 

    String st = null; 
    try { 
     st = new String(byteArray, "UTF-16"); 
    } catch (UnsupportedEncodingException e1) { 
     e1.printStackTrace(); 
     return null; 
    } 

    Log.d(TAG, "====UNPERSIST \n" + st); 

    BattleTurnData retVal = new BattleTurnData(passedContext); 

    try { 
     JSONObject obj = new JSONObject(st); 

     if (obj.has("data")) { 
      retVal.gameData = obj.getString("data"); 
     } 
     if (obj.has("turnCounter")) { 
      retVal.turnCounter = obj.getInt("turnCounter"); 
     } 

    } catch (JSONException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return retVal; 
} 
}//end BattleTurn 

내 로그 캣입니다 : 여기

턴 데이터 클래스입니다
12-17 21:55:20.426: E/AndroidRuntime(1808): FATAL EXCEPTION: main 
12-17 21:55:20.426: E/AndroidRuntime(1808): Process: com.project.llb, PID: 1808 
12-17 21:55:20.426: E/AndroidRuntime(1808): java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler)' on a null object reference 
12-17 21:55:20.426: E/AndroidRuntime(1808):  at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:263) 
12-17 21:55:20.426: E/AndroidRuntime(1808):  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224) 
12-17 21:55:20.426: E/AndroidRuntime(1808):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164) 
12-17 21:55:20.426: E/AndroidRuntime(1808):  at com.twentytwentythree.sab.Database.open(Database.java:383) 
12-17 21:55:20.426: E/AndroidRuntime(1808):  at com.twentytwentythree.sab.BattleTurnData.persist(BattleTurnData.java:33) 
12-17 21:55:20.426: E/AndroidRuntime(1808):  at com.twentytwentythree.sab.BattleActivity.startMatch(BattleActivity.java:527) 
12-17 21:55:20.426: E/AndroidRuntime(1808):  at com.twentytwentythree.sab.BattleActivity.processResult(BattleActivity.java:667) 
12-17 21:55:20.426: E/AndroidRuntime(1808):  at com.twentytwentythree.sab.BattleActivity.access$0(BattleActivity.java:653) 
12-17 21:55:20.426: E/AndroidRuntime(1808):  at com.twentytwentythree.sab.BattleActivity$1.onResult(BattleActivity.java:232) 
12-17 21:55:20.426: E/AndroidRuntime(1808):  at com.twentytwentythree.sab.BattleActivity$1.onResult(BattleActivity.java:1) 
12-17 21:55:20.426: E/AndroidRuntime(1808):  at com.google.android.gms.common.api.a$c.b(Unknown Source) 
12-17 21:55:20.426: E/AndroidRuntime(1808):  at com.google.android.gms.common.api.a$c.handleMessage(Unknown Source) 
12-17 21:55:20.426: E/AndroidRuntime(1808):  at android.os.Handler.dispatchMessage(Handler.java:102) 
12-17 21:55:20.426: E/AndroidRuntime(1808):  at android.os.Looper.loop(Looper.java:157) 
12-17 21:55:20.426: E/AndroidRuntime(1808):  at android.app.ActivityThread.main(ActivityThread.java:5872) 
12-17 21:55:20.426: E/AndroidRuntime(1808):  at java.lang.reflect.Method.invoke(Native Method) 
12-17 21:55:20.426: E/AndroidRuntime(1808):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:852) 
12-17 21:55:20.426: E/AndroidRuntime(1808):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:668) 

그리고 그런데

는, 라인 (33) data.open를 말한다 라인()이다;

왜이 클래스와 다른 클래스의 데이터베이스에 액세스 할 수 있는지 이해할 수 없습니다. 나는이 모든 것에 익숙하지 않기 때문에 나는 아직도 배울 것이 많다. 어떤 도움을 주셔서 감사합니다. 고마워.

답변

2

null을 전달했거나 다른 ContextSQLiteOpenHelper 생성자에 전달했습니다.


스택 트레이스를 보면

및 코드, BattleTurnData extends Acitivity 및 명시 적 생성자 BattleTurnData(Context context) 의심 보인다. new으로 액티비티를 인스턴스화 할 수 없으며 프레임 워크가 인스턴스화 한 액티비티에는 인수를 취하는 생성자가 없습니다. 따라서 해당 클래스의 this 참조는 유효하지 않습니다. Context.

모양은 BattleTurnData은 활동이 아니라 일반 수업이어야합니다. Context을 필요한 메소드에 인수로 전달하십시오.

+0

이 문제를 해결하는 방법을 모르겠습니다. API의 클래스는 그들 사이의 컨텍스트를 전달하지 않습니다. – sboehnke

+0

먼저 stacktrace를 살펴 보았습니다. 이제 여러분에게 더 많은 방향을 제시하는 코드를 살펴 보았습니다. – laalto

+0

죄송합니다. 나는이 모든 것을 처음 접했습니다. 그래서 BattleTurnData는 원래 Activity를 확장하지 않았습니다. 그것은 특정 전화를 통해 컨텍스트를 얻으려는 나의 방법이었습니다. BattleTurnData는 BattleTurn에 의해 호출되며 클래스는 활동을 확장하지만 이는 어디서나 컨텍스트를 다루지 않습니다. BattleTurnData 컨텍스트를 제공하는 방법은 무엇입니까? – sboehnke