[英]NullPointerException while accessing SQLite from non-activity class
[英]NullPointerException accessing Room Database from Utility Class (non-Activity)
我一直在嘗試為我的Android應用程序創建一個實用程序類,因此,不是每個Activity都調用Room數據庫,而是所有操作都將在一個“ Utility”類中執行,並在需要時,隨地從每個活動中請求。
我試圖以與SettingsActivity(在onCreate中)以及負責所需操作的相應類中相同的方式建立與數據庫的連接-沒有任何運氣。
首先,用於從Activity類中檢索Room數據庫中保存的票價數量的代碼。
SettingsActivity.java
public void deletingFares(View view) {
// start of attempt of getting the value from QueriesUtility class
QueriesUtility qu = new QueriesUtility();
String quString = qu.returnNumberOfFares();
Toast.makeText(SettingsActivity.this,
"Data from Queries Utilities class: (number of fares):"
+ quString, Toast.LENGTH_LONG).show();
// end
QueriesUtility.java類的代碼:
public class QueriesUtility extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
// FARES DB
// establishing connection with db
mFareDAO = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "db-fares")
.build()
.getFareDAO();
}
public String returnNumberOfFares() {
CalcNumberOfFares ss = new CalcNumberOfFares();
ss.execute("");
return numberOfFares;
}
String numberOfFares = "d0";
private FareDAO mFareDAO;
/**
* CALCULATING NUMBER OF FARES
*/
private class CalcNumberOfFares extends AsyncTask<String, Integer, String> {
// #1 - This is run in a background thread
@Override
protected String doInBackground(String... params) {
// get the string from params, which is an array
String myString = params[0];
// FARES DB
// establishing connection with db
mFareDAO = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "db-fares")
.build()
.getFareDAO();
List<Fare> fares = mFareDAO.getAllFares();
myString = String.valueOf(fares.size());
numberOfFares = myString;
return myString;
}
// #2 - This runs in UI when background thread finishes
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
numberOfFares = result;
// todo
}
}
/**
*
* END
*/
}
如您所知-我試圖以一種絕望的方式用兩種方式建立與數據庫的連接;)(在onCreate以及CalcNumberOfFares中)。 是否忽略“ onCreate”-類是非活動類?
以下是帶有錯誤的日志:
E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #4
Process: com.example.android.taxidriverassistant, PID: 26280
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:353)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
at java.util.concurrent.FutureTask.run(FutureTask.java:271)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:119)
at com.example.android.taxidriverassistant.QueriesUtility$CalcNumberOfFares.doInBackground(QueriesUtility.java:57)
at com.example.android.taxidriverassistant.QueriesUtility$CalcNumberOfFares.doInBackground(QueriesUtility.java:47)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)
I/Process: Sending signal. PID: 26280 SIG: 9
Application terminated.
在活動類中執行對Room DB的調用時-一切正常。
這是在SettingsActivity.java中與Room數據庫建立連接的方式:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
// FARES DB
// establishing connection with db
mFareDAO = Room.databaseBuilder(this, AppDatabase.class, "db-fares")
.build()
.getFareDAO();
以及DeletingFares的代碼(可在SettingsActivity.java類中使用):
/**
* DELETING FARES CLASS
*/
private class DeletingFares extends AsyncTask<String, Integer, String> {
// #1 - This is run in a background thread
@Override
protected String doInBackground(String... params) {
// get the string from params, which is an array
String myString = params[0];
List<Fare> fares = mFareDAO.getAllFares();
myString = String.valueOf(fares.size());
numberOfFares = myString;
// value of myString is send over to onPostExecute and used in the end to make an Alert
// if there are no fares - no further action should take place
if (fares.size() > 0) {
for (int i = 0; i < fares.size(); i++) {
Fare ff = fares.get(i);
mFareDAO.delete(ff);
}
}
return myString;
}
// #2 - This runs in UI when background thread finishes
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
// invoking method which displays the alert at the end
alertAfterDeletingFares();
}
}
據我了解NullPointerException背后的概念-QueriesUtility類中對對象的引用(但從SettingsActivity類請求)不存在,因為它與數據庫沒有連接,因此要引用該對象並返回null(正確嗎? )。
如果有人能指出我正確的方向,我將不勝感激。 非常感謝!
您需要將context
傳遞給AsyncTask
而不是使用getApplicationContext()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.