2016-01-19 2 views
-3

Мне нужно использовать обработчик базы данных внутри класса non activity, но для этого мне нужен контекст, и я не могу его получить. Я попытался использовать это, но не повезло,Контекст внутри класса неактивности

protected Context context; 

    public Example(Context context){ 
     this.context = context.getApplicationContext(); 
    } 

Он всегда выдает эту ошибку:

Caused by: 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 

EDIT:

public class Telnet extends AsyncTask<Void, Void, Void> { 
    wifiHistoryDatabaseHandler wifihist; 

    @Override 
    protected Void doInBackground(Void... params) { 


     wifihist = new wifiHistoryDatabaseHandler(context); 
} 

WifiHistoryDatabaseHandler:

public class wifiHistoryDatabaseHandler extends SQLiteOpenHelper { 
    private static final int DATABASE_VERSION = 1; 
    // Database Name 
    private static final String DATABASE_NAME = "information_db_232"; 
    // Contacts table name 
    private static final String TABLE_CONTACTS = "wifi_history"; 

    public static final String ID = "id"; 
    public static final String message = "message"; 
    public static final String message_source = "message_source"; 
    public static final String time = "time"; 


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

    // Creating Tables 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
     String CREATE_CONTACTS_TABLE = "CREATE TABLE " 
       + TABLE_CONTACTS + "(" + ID 
       + " INTEGER PRIMARY KEY,"+message+","+message_source+","+time+");"; 
     db.execSQL(CREATE_CONTACTS_TABLE); 
    } 

    // Upgrading database 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // Drop older table if existed 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS); 

     // Create tables again 
     onCreate(db); 
    } 


    //add line 
    public void addLine(wifiHisotryClass info) { 
     SQLiteDatabase db = this.getWritableDatabase(); 

     ContentValues values = new ContentValues(); 
     values.put(message, info.get_message()); 
     values.put(message_source, info.get_message_source()); 
     values.put(time, info.get_time()); 



     // Inserting Row 
     db.insert(TABLE_CONTACTS, null, values); 
     db.close(); // Closing database connection 
    } 


    // Getting single contact 
    public wifiHisotryClass getContact(int id) { 
     SQLiteDatabase db = this.getReadableDatabase(); 

     Cursor cursor = db.query(TABLE_CONTACTS, new String[]{ID 
         ,message,message_source, time}, ID + "=?", 
       new String[]{String.valueOf(id)}, null, null, null, null); 
     if (cursor != null) 
      cursor.moveToFirst(); 

     wifiHisotryClass info = new wifiHisotryClass(Integer.parseInt(cursor.getString(0)),cursor.getString(1), cursor.getString(2), cursor.getString(3)); 

     // return info 
     return info; 
    } 

    // Getting contacts Count 
    public int getContactsCount() { 
     String countQuery = "SELECT * FROM " + TABLE_CONTACTS; 
     SQLiteDatabase db = this.getReadableDatabase(); 

     Cursor cursor = db.rawQuery(countQuery, null); 
     int num = cursor.getCount(); 
     cursor.close(); 

     // return count 
     return num; 
    } 


    // Updating single contact 
    public int updateContact(wifiHisotryClass info) { 
     SQLiteDatabase db = this.getWritableDatabase(); 

     ContentValues values = new ContentValues(); 
     values.put(message, info.get_message()); 
     values.put(message_source, info.get_message_source()); 
     values.put(time, info.get_time()); 

     // updating row 
     return db.update(TABLE_CONTACTS, values, ID + " = ?", 
       new String[] { String.valueOf(info.getID()) }); 
    } 


    // Deleting single contact 
    public void deleteContact(Info info) { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     db.delete(TABLE_CONTACTS, ID + " = ?", 
       new String[]{String.valueOf(info.getID())}); 
     db.close(); 
    } 

    void deleteAll() 
    { 
     SQLiteDatabase db= this.getWritableDatabase(); 
     db.delete(TABLE_CONTACTS, null, null); 

    } 


} 
+1

Ошибка не в коде, который вы показываете. Пожалуйста, покажите код, где вы открываете БД. Я не спустил BTW –

+0

@bigdestroyer Спасибо, я редактирую свой вопрос – scottbear

+0

Можете ли вы показать класс WifiHistoryDatabaseHandler? –

ответ

0
public Example(Context context){ 
     this.context = context.getApplicationContext(); 
    } 

Почему? использование

this.context = context; 

вместо этого.

или

wifihist = new wifiHistoryDatabaseHandler(getActivity()); 

Контекст переменной в классе телнет равна нулю.

Вы можете рассмотреть, чтобы передать контекст непосредственно в конструкторе Telnet задачи асинхронного описание объекта

public Telnet(Context c) 
{ 
    mContext = c; 
} 
+0

Это то же самое. Такая же ошибка – scottbear

+0

контекст в telnet-классе равен null. попробуйте wifihist = new wifiHistoryDatabaseHandler (getActivity()); –

+0

«не может решить methos getActivity» Это то, что я использую в классах активности. – scottbear

0

Move wifiHistoryDatabaseHandler класс, внутри функции, в которой вы пытаетесь получить доступ к нему, а не объявить его во всем мире.

0

Вы должны использовать приложение в качестве одноплодного класса

public class MyApplication extends Application { 

    private static Context mContext; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     mContext = getApplicationContext(); 
    } 

    public static Context getContext() { 
     return mContext; 
    } 
} 

Не забудьте объявить приложения в файле манифеста:

<application 
    android:name=".MyApplication" 
    android:icon="@drawable/icon" 
    android:label="@string/app_name" > 

С таким образом, вы можете получить контекст приложения из любых не класс активности вашего приложения с использованием MyApplication.getContext()

От: https://stackoverflow.com/a/21819009/4848308

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