【问题标题】:I’m so stuck…Databases…我被困住了……数据库……
【发布时间】:2019-04-30 10:48:14
【问题描述】:

我尝试将我的应用程序的插入数据存储到数据库中。所以我选择了 SQLiteDatabase,因为这就是 我在我的纳米学位中见过。现在我到了我想从 ListView 中点击一个项目的地步 去 EditorActivity。当我在 EditorActivity.java 中编写 CursorLoader 代码以显示插入的数据并更新它们 时,应用程序在启动之前就崩溃了……

编辑器活动(这里称为 MainActivity,但这里是 EditText 字段):

public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor>{

private static final int EXISTING_CONTAINER_LOADER = 0;

DexamenesCursorAdapter mCursorAdapter;
private Uri mCurrentContainerUri;

 (...)

@Override
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
// Since the editor shows all container attributes, define a projection that contains
// all columns from the container table
String[] projection = {
        DexameniEntry._ID,
        DexameniEntry.COLUMN_a,
        DexameniEntry.COLUMN_b,
        DexameniEntry.COLUMN_c,};


// This loader will execute the ContentProvider's query method on a background thread
return new CursorLoader(this,
        mCurrentContainerUri,
        projection,
        null,
        null,
        null);

}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data){

if (data.moveToFirst()) {
    if (data.moveToFirst()) {

        // Find the columns of pet attributes that we're interested in
        int aColumnIndex = data.getColumnIndex(DexameniEntry.COLUMN_a);
        int bColumnIndex = data.getColumnIndex(DexameniEntry.COLUMN_b);
        int cColumnIndex = data.getColumnIndex(DexameniEntry.COLUMN_c);


        // Extract out the value from the Cursor for the given column index
        int a = data.getInt(aColumnIndex);
        int b = data.getInt(bColumnIndex);
        int c = data.getInt(cColumnIndex);

        // Update the views on the screen with the values from the database
        mEditX1a.setText(Integer.toString(a));
        mEditX1b.setText(Integer.toString(b));
        mEditX1c.setText(Integer.toString(c));
    }

    mCursorAdapter.swapCursor(data);
}
}

@Override
public void onLoaderReset(Loader<Cursor> loader) {
mCursorAdapter.swapCursor(null);
}

这是 logcat

2018-11-28 15:51:44.853 26449-26470/com.example.android.deyalcalculator 
E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
Process: com.example.android.deyalcalculator, PID: 26449
java.lang.RuntimeException: An error occurred while executing 
doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:318)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:760)
Caused by: java.lang.NullPointerException: uri
at com.android.internal.util.Preconditions.checkNotNull(Preconditions.java:111)
at android.content.ContentResolver.query(ContentResolver.java:515)
at android.content.CursorLoader.loadInBackground(CursorLoader.java:64)
at android.content.CursorLoader.loadInBackground(CursorLoader.java:56)
at android.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:312)
at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:69)
at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:66)
at android.os.AsyncTask$2.call(AsyncTask.java:304)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:760)
2018-11-28 15:51:44.891 26449-26449/com.example.android.deyalcalculator E/HAL: PATH3 /odm/lib64/hw/gralloc.qcom.so
 2018-11-28 15:51:44.891 26449-26449/com.example.android.deyalcalculator E/HAL: PATH2 /vendor/lib64/hw/gralloc.qcom.so
2018-11-28 15:51:44.891 26449-26449/com.example.android.deyalcalculator E/HAL: PATH1 /system/lib64/hw/gralloc.qcom.so
 2018-11-28 15:51:44.891 26449-26449/com.example.android.deyalcalculator E/HAL: 
 PATH3 /odm/lib64/hw/gralloc.msm8953.so
2018-11-28 15:51:44.891 26449-26449/com.example.android.deyalcalculator E/HAL: PATH2 /vendor/lib64/hw/gralloc.msm8953.so
 2018-11-28 15:51:44.891 26449-26449/com.example.android.deyalcalculator E/HAL: PATH1 /system/lib64/hw/gralloc.msm8953.so

我不知道如何解决这个问题。老实说,我什至不知道 SQLiteDatabase 是否是最佳选择 因为我希望该应用能够在很长一段时间内存储数据公司的水质测量数据并生成图表(就像在股票相关的应用中一样)(每周图表测量,月,年)...

有没有人对特定问题的解决方案或一般存储此类数据的更好方法有任何想法?请......(我对编译感到疲倦和绝望)

【问题讨论】:

  • 您在这里询问了几件事。您需要有关 SQLite 配置的帮助,还是需要有关数据库设计的建议?
  • 你对mCurrentContainerUri的定义在哪里?
  • @TimBiegeleisen 主要是我问如何修复应用程序崩溃..但是如果您对此有任何想法,我也想知道以这种方式实现这些功能的最佳方法是什么(存储数据,用它们生成图表)...

标签: java sqlite nullpointerexception sql-update android-cursorloader


【解决方案1】:

这个字段好像是 mCurrentContainerUri 是空值或者没有初始化。

if you see the source code for the class com.android.internal.util.Preconditions

你可以在第 111 行看到

/**
 * Ensures that an object reference passed as a parameter to the calling
 * method is not null.
 *
 * @param reference an object reference
 * @return the non-null reference that was validated
 * @throws NullPointerException if {@code reference} is null
 */
public static @NonNull <T> T checkNotNull(final T reference) {
    if (reference == null) {
        throw new NullPointerException();
    }
    return reference;
}

在你的情况下 uri 是 null 并且在某个地方调用了 checkNotNull 方法,检查 uri 是否为 null ,因此抛出空指针异常。

【讨论】:

  • 好的,谢谢...所以我必须将单击的列表项的特定 Uri 分配给 mCurrentContainerUri。你能帮我用代码写这个吗?
  • 没问题 dalmation 。首先尝试分配值并让我知道。如果还是不行,创建一个 git 项目并分享 url 我会看看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
  • 1970-01-01
  • 2017-09-26
  • 1970-01-01
相关资源
最近更新 更多