簡體   English   中英

NullPointerException從實用程序類訪問會議室數據庫(非活動)

[英]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()

在AsyncTask類中引用getApplicationContext嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM