java - 如果 SQLite 中的值为空,则跳过插入
问题描述
在插入到 Android SQLite 数据库时,我想跳过用户未填写的值。但我得到空指针异常。
在我的 DBHelper 类中,我尝试了“... NOT NULL”和没有非 null 选项,但我认为这不是解决方案。
public void addToDb(View view) {
SharedPreferences sharedPreferences = getSharedPreferences("entry",0);
float lastlatitude = sharedPreferences.getFloat("latitude",0f);
float lastlongitude = sharedPreferences.getFloat("longitude",0f);
if (mTitleInput.getText().length() == 0 ||
mEntryInput.getText().length() == 0) {
return;
}
try {
Date a = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("EEE, MMM d, ''yy");
String o = sdf.format(a);
title = mTitleInput.getText().toString();
entry = mEntryInput.getText().toString();
dateStr = o;
image = getApplicationContext().getFilesDir().getAbsolutePath() + String.valueOf(System.currentTimeMillis()) + ".jpg";
rating = mRatingBar.getRating();
latitude = lastlatitude;
longitude = lastlongitude;
} catch (NumberFormatException ex) {
Log.e(LOG_TAG, "Failed to parse party size text to number: " + ex.getMessage());
}
// Add to mDb
addNewEntry(title, entry, dateStr, image, rating, latitude, longitude);
//clear UI text fields
mTitleInput.getText().clear();
mEntryInput.getText().clear();
}
编辑 1:堆栈跟踪。
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.aok.secretdiarywithlock, PID: 29148
java.lang.NullPointerException: Attempt to invoke virtual method 'long android.database.sqlite.SQLiteDatabase.insert(java.lang.String, java.lang.String, android.content.ContentValues)' on a null object reference
at com.aok.secretdiarywithlock.CreateEntry.addNewEntry(CreateEntry.java:157)
at com.aok.secretdiarywithlock.CreateEntry.addToDb(CreateEntry.java:139)
at com.aok.secretdiarywithlock.CreateEntry$1.onClick(CreateEntry.java:93)
at android.view.View.performClick(View.java:6597)
at android.view.View.performClickInternal(View.java:6574)
at android.view.View.access$3100(View.java:778)
at android.view.View$PerformClick.run(View.java:25885)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
编辑 2:错误代码
private long addNewEntry(String title, String entry, String date, String image, Float rate, Float latitude, Float longitude){
ContentValues cv = new ContentValues();
cv.put(EntryContract.EntryEntry.COLUMN_TITLE,title);
cv.put(EntryContract.EntryEntry.COLUMN_TEXT,entry);
cv.put(EntryContract.EntryEntry.COLUMN_DATE,date);
cv.put(EntryContract.EntryEntry.COLUMN_IMAGE,image);
cv.put(EntryContract.EntryEntry.COLUMN_TEXT,entry);
cv.put(EntryContract.EntryEntry.COLUMN_RATING,rate);
cv.put(EntryContract.EntryEntry.COLUMN_LOCATION_LAT,latitude);
cv.put(EntryContract.EntryEntry.COLUMN_LOCATION_LONG,longitude);
// Next line is throwing error
return mDb.insert(EntryContract.EntryEntry.TABLE_NAME, null, cv);
}
解决方案
嗨,您必须检查它们是否为空,例如
dateStr = o == null ? "" : o;
这将检查是否o
为空,如果是,它将设置 dateStr 为空,如果不是,它将使用 o。您可以将其用于所有变量。
推荐阅读
- spring-boot - 在微服务中存储数据库用户名和密码的最佳方法是什么
- r - 如何创建与全名单词的前 9 个字符匹配的条件?
- powerbi - 根据 Power bi 中经过身份验证的用户有条件地显示仪表板
- laravel - 使用地图后 Laravel 集合为空
- html5-canvas - Phaser 3. 导入 phaser/src/core/Game 在运行时产生错误
- python - 从另一个数据框的行值设置数据框索引
- android - 如何在 Jetpack Compose 中将图像 URL 设置为线圈上的错误占位符
- http - 如何通过 HTTP API 将文件或文件夹写入 IPFS
- swift - Swift tableviewcell 高度保持固定
- reactjs - 在 React 中上传文件时如何编写验证