0

ここに私のクラスがあります:

StatsObjectId.java

public class StatsObjectId  extends Activity {
    DBClass db;
    protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    db = new DBClass(this);
    }
    public void addObjId(String objid){
    Log.e("objectid","This is the object id going to store: "+objid);


            db.addObjectId(objid);  //This is the line# 105


            if(getObjId()){
        Log.e("objectid","Successfully stored!");
    }else{
        Log.e("objectid","Error in storing object id!");
        }
    }
    public boolean getObjId(){
    boolean result;
    try{
    c = db.getObjectId();
    c.moveToFirst();
    String str = c.getString(c.getColumnIndex("objectid"));
    Log.e("objectid","Object id returned form DB: "+str);
    result = true;
    }catch(CursorIndexOutOfBoundsException e){
        Log.e("objectid","Cursor index out of bound");
        result = false;
        e.printStackTrace();
    }catch(Exception e){
        Log.e("objectid","Some Another Exception");
        result = false;
        e.printStackTrace();
    }
    return result;
}

ParseComServerAccessor.java

public class ParseComServerAccessor {
//I am skipping some irrelevant code
     public void putStats(String authtoken, String userId, Tas statsToAdd) throws Exception {
     //Again skip some code
     //Here I got some HttpResponse and I need to extract an object id and save it to database
     HttpResponse response = httpClient.execute(httpPost);
     String responseString = EntityUtils.toString(response.getEntity());
     JSONObject json = new JSONObject(responseString);
     Log.e("objectid","Now Object Id is: "+json.getString("objectId") );
     StatsObjectId ob = new StatsObjectId();


     ob.addObjId(json.getString("objectId")); // This is the line#156
     //skip some code
     }
}

TasSyncAdapter.java

public class TasSyncAdapter extends AbstractThreadedSyncAdapter {
    //skipped Constructor code
    public void onPerformSync(Account account, Bundle extras, String authority,
    ContentProviderClient provider, SyncResult syncResult) {
    //skipped some code
    ParseComServerAccessor parseComService = new ParseComServerAccessor();
    //skipped some code again


    parseComService.putStats(authToken, userObjectId, remoteTas); //This is the line# 134
    //skip some code
    }
}

最後に、アプリを実行すると...これは次の Log Cat です

Tag                    Text

objectid               This is the object id going to store: 9AFysqffz7
System.err             java.lang.NullPointerException
System.err             at com.myapp.ds_app.StatsObjectId.addObjId(StatsObjectId.java:105)
System.err             at com.myapp.ds_app.syncadapter.ParseComServerAccessor.putStats(ParseComServerAccessor.java:156)
System.err             at com.myapp.ds_app.syncadapter.TasSyncAdapter.onPerformSync(TasSyncAdapter.java:134)
System.err             at android.content.AbstractThreadedSyncAdapter$SyncThread.run(AbstractThreadedSyncAdapter.java:254)

DBClass.java

public class DBClass extends SQLiteOpenHelper { 
private static final String DATABASE_NAME="myapp.db";
public DBClass(Context cxt){
    super(cxt, DATABASE_NAME, null, 1);
}
@Override
public void onCreate(SQLiteDatabase mydatabase) {
    mydatabase.execSQL("CREATE TABLE IF NOT EXISTS temp (objectid STRING)");
}
public Cursor getObjectId(){
    Cursor cursor = getReadableDatabase().rawQuery("SELECT objectid FROM temp", null);
    return cursor;
}
public void addObjectId(String objid){
    try{
    ContentValues cv = new ContentValues(1);

    Log.e("objectid","In DBClass and object id: "+objid);
    cv.put("objectid", objid);
    Log.e("objectid","Content value contains: "+cv.toString());
    getWritableDatabase().insert("temp", "objectid", cv);

    }catch(NullPointerException e){
        e.printStackTrace();
    }
}

}

今、私はこの時点で立ち往生しています!これまでのところ、1 つの値だけを保存する必要があります。データベースに値を保存する代わりに、ファイルを作成しようとしました。ただし、やはり ContextWrapper にはいくつかの例外があります。

私は現在、データベースを扱うことに興味があります。

他に情報が必要な場合はお知らせください。

どなたかこのことを説明していただければ幸いです。私はアンドロイドの初心者で、この問題について学びたいと思っています。前もって感謝します!

4

1 に答える 1

2
StatsObjectId ob = new StatsObjectId();

Activity クラスをインスタンス化しています。そんなことは許されません。(Android には、それを行うときに通知する何かが実際にあるはずです) 基本的に、コンテキストは初期化されません。

さらに、Android は (アクティビティの作成時に) 適切なコンテキストで onCreate メソッドを呼び出します。あなたはそうしません(そしてあなたもできません)、したがって、あなたのデータベースはnullです。

AbstractThreadedSyncAdapter にはgetContext、適切なコンテキストを取得するメソッドがあります。これを使用して、Activity オブジェクトにデータを渡すのではなく、データベースを初期化し、データベースにデータを挿入します。

于 2013-10-25T19:08:02.673 に答える