2013-10-25 5 views
0

Вот мои следующие классы:Я не могу создать базу данных SQLite. ОШИБКА: java.lang.NullPointerException

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(); 
    } 
} 

} 

Теперь я stucked в этот момент! До сих пор мне нужно было сохранить только одно значение. Я попытался создать файл вместо сохранения значения в базе данных. Но опять-таки есть исключение из ContextWrapper.

В настоящее время я заинтересован в работе с базой данных.

Пожалуйста, дайте мне знать, если вам нужна другая информация.

Я был бы очень признателен, если кто-нибудь объяснит это. Я новичок android и хотел бы узнать об этой проблеме. Заранее спасибо!

+3

Много кода. Пожалуйста, разверните его до того, что имеет отношение к вашей проблеме. – Prateek

+0

Просто выстрел, я бы сказал, 'db' является' null' в строке 105. Где он инициализирован? – dic19

+0

@Prateek Потому что я хочу, чтобы вы, ребята, предоставили максимум возможностей, которые я могу! – Yasir

ответ

2
StatsObjectId ob = new StatsObjectId(); 

Вы инициируете класс деятельности. Вам не разрешено это делать. (В Android действительно должно быть что-то сказать вам, когда вы это делаете). В принципе, контекст не инициализируется, потому что андроид должен сделать это, чтобы иметь функциональную активность.

Плюс, Android (при создании Activity) вызывает метод onCreate с соответствующим контекстом. У вас нет (и вы тоже не можете), поэтому ваш db имеет значение null.

В AbstractThreadedSyncAdapter у вас есть метод getContext, чтобы получить правильный контекст. Используйте это, чтобы инициализировать свою базу данных и вставить в нее данные, а не передавать ее объекту Activity.

Смежные вопросы