- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
当从两个不同的 Activity 引用时,我试图让一些与数据库有关的方法工作,这导致我在同一类中使用不同的上下文重新初始化整个数据库。它适用于一个 Activity ,但是当数据库在另一个 Activity 中关闭、初始化和打开时,它会导致 IllegalArgumentException。这对我来说毫无意义,因为我没有更改任何直接连接到数据库的方法,并且当代码被分成两个类时它可以完美地工作。
堆栈跟踪:
05-09 20:44:42.661: E/AndroidRuntime(953): FATAL EXCEPTION: main
05-09 20:44:42.661: E/AndroidRuntime(953): java.lang.RuntimeException: Unable to resume activity {maturaarbeit.nicola_pfister.marks/maturaarbeit.nicola_pfister.marks.Marks}: java.lang.IllegalArgumentException: the bind value at index 1 is null
05-09 20:44:42.661: E/AndroidRuntime(953): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2575)
05-09 20:44:42.661: E/AndroidRuntime(953): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2603)
05-09 20:44:42.661: E/AndroidRuntime(953): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2089)
05-09 20:44:42.661: E/AndroidRuntime(953): at android.app.ActivityThread.access$600(ActivityThread.java:130)
05-09 20:44:42.661: E/AndroidRuntime(953): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
05-09 20:44:42.661: E/AndroidRuntime(953): at android.os.Handler.dispatchMessage(Handler.java:99)
05-09 20:44:42.661: E/AndroidRuntime(953): at android.os.Looper.loop(Looper.java:137)
05-09 20:44:42.661: E/AndroidRuntime(953): at android.app.ActivityThread.main(ActivityThread.java:4745)
05-09 20:44:42.661: E/AndroidRuntime(953): at java.lang.reflect.Method.invokeNative(Native Method)
05-09 20:44:42.661: E/AndroidRuntime(953): at java.lang.reflect.Method.invoke(Method.java:511)
05-09 20:44:42.661: E/AndroidRuntime(953): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
05-09 20:44:42.661: E/AndroidRuntime(953): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
05-09 20:44:42.661: E/AndroidRuntime(953): at dalvik.system.NativeStart.main(Native Method)
05-09 20:44:42.661: E/AndroidRuntime(953): Caused by: java.lang.IllegalArgumentException: the bind value at index 1 is null
05-09 20:44:42.661: E/AndroidRuntime(953): at android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:164)
05-09 20:44:42.661: E/AndroidRuntime(953): at android.database.sqlite.SQLiteProgram.bindAllArgsAsStrings(SQLiteProgram.java:200)
05-09 20:44:42.661: E/AndroidRuntime(953): at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47)
05-09 20:44:42.661: E/AndroidRuntime(953): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314)
05-09 20:44:42.661: E/AndroidRuntime(953): at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1161)
05-09 20:44:42.661: E/AndroidRuntime(953): at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1032)
05-09 20:44:42.661: E/AndroidRuntime(953): at maturaarbeit.nicola_pfister.marks.database.DBAdapter.getAverage(DBAdapter.java:200)
05-09 20:44:42.661: E/AndroidRuntime(953): at maturaarbeit.nicola_pfister.marks.MyMenu.getData(MyMenu.java:71)
05-09 20:44:42.661: E/AndroidRuntime(953): at maturaarbeit.nicola_pfister.marks.Marks.onResume(Marks.java:52)
05-09 20:44:42.661: E/AndroidRuntime(953): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1184)
05-09 20:44:42.661: E/AndroidRuntime(953): at android.app.Activity.performResume(Activity.java:5082)
05-09 20:44:42.661: E/AndroidRuntime(953): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2565)
05-09 20:44:42.661: E/AndroidRuntime(953): ... 12 more
Marks(menu.onResume)中的异常抛出方法:
private final Context context;
private DatabaseHelper DBHelper;
private SQLiteDatabase db;
MyMenu menu = new MyMenu(this);
ListView lView;
View view;
private String TAG = "Marks";
@Override
protected void onResume() {
super.onResume();
menu.closedb();
menu.opendb(TAG);
menu.getData(lView, view);
}
MyMenu中涉及的方法(db.open()异常):
DBAdapter db;
public void opendb(String caller) {
db = new DBAdapter(context);
this.caller = caller; //Is used to distinguish which activity called the class; not involved in this problem
db.open();
}
public void closedb() {
db.clean();
db.close();
}
@SuppressWarnings("deprecation")
public String getData(final ListView lView, final View view) {
SimpleCursorAdapter adapter = null;
if (caller == "Main") {
adapter = new SimpleCursorAdapter(context,
android.R.layout.simple_list_item_activated_1,
db.getAllSubjects(),
new String[] { "subject" },
new int[] { android.R.id.text1 });
} else if (caller == "Marks") {
adapter = new SimpleCursorAdapter(context,
android.R.layout.simple_list_item_activated_1,
db.getMarks(subject),
new String[] {"value"},
new int[] { android.R.id.text1 });
Cursor cursor = db.getAverage(selection);
average = cursor.getDouble(cursor.getColumnIndexOrThrow(DBAdapter.KEY_VALUE));
if (average != 0.0) {
TextView text = new TextView(context);
text = (TextView)view.findViewById(R.id.marks_average);
text.setText(context.getString(R.string.average) + " " + average);
text.setBackgroundColor(context.getResources().getColor(R.color.lightgrey));
} else {
TextView text = new TextView(context);
text = (TextView)view.findViewById(R.id.marks_average);
text.setText("");
text.setBackgroundColor(context.getResources().getColor(android.R.color.transparent));
}
}
DBAdapter 中涉及的方法(在一个 Activity 中工作正常,在 getAverage() 上抛出异常):
public DBAdapter open() throws SQLException {
db = DBHelper.getWritableDatabase();
return this;
}
public void close() {
DBHelper.close();
}
public boolean clean () {
db.delete(DATABASE_TABLE_SUBJECTS, KEY_SUBJECT +"=?", new String[] {""});
db.delete(DATABASE_TABLE_MARKS, KEY_VALUE + "=?", new String[] {""});
return true;
}
public Cursor getAverage(String subject) throws SQLException {
Cursor mCursor =
db.query(true, DATABASE_TABLE_AVERAGE, new String[] {
KEY_ROWID,
KEY_SUBJECT,
KEY_VALUE
},
KEY_SUBJECT + "=?",
new String[] {subject}, null, null, null, null);
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}
我最初认为错误出在 open() 方法中,但在查看堆栈跟踪时我发现异常是由 getAverage() 抛出的,这让我很困惑,因为此时甚至没有调用它。我假设在 Marks Activity 中正确初始化 DBAdapter 类缺少一些东西,但找不到罪魁祸首。如果您需要更多信息或代码来解决这个难题,请随时告诉我。非常感谢您的帮助!
最佳答案
我可以看看 menu.getData(lView, view)
方法吗?
无论如何,我建议不要从 Database Helper 类返回 Cursor
对象。为什么?因为,可能有多个调用,可能是对数据库的并行调用。每次你需要从数据库中获取一些东西时,你都需要打开它,然后关闭它。如果您的应用程序的一部分将关闭数据库,而另一部分尚未完成其工作 - 并且将尝试从数据库中的数据访问某些内容或尝试从 Cursor
对象获取数据 - 它肯定会崩溃。
我的解决方案是制作一些应用程序模型<=> 数据库模型对象,它将双向映射数据。
例如:
public LinkedList<Person> getPersonList(){
Cursor result = db.query(...);
LinkedList<Person> people = null;
if(result.moveToFirst()){
people = new LinkedList<Person>();
Person person = null;
do{
person = new Person();
person.setBirthDate(result.getInt(0));
/*some more attributes mapping*/
people.add(person);
}while(result.hasNext());
}
return people;
}
关于Android [IllegalArgumentException : the bind value at index 1 is null] for no apparent reason,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16471410/
最近开始学习oracle和sql。 在学习的过程中,我遇到了几个问题,我的 friend 在接受采访时被问到这些问题。 SELECT * FROM Employees WHERE NULL IS N
这个问题在这里已经有了答案: Can we subtract NULL pointers? (4 个回答) 关闭 2 个月前。 是否定义了NULL - NULL? (char *)NULL - (ch
是否有推荐的方法(根据 .net Framework 指南)检查 null,例如: if (value == null) {//code1} else {//code2} 或 if (value !=
我正在尝试将值插入数据库,但出现这样的错误任何人都可以告诉我为什么该值为空,如下所示: An exception occurred while executing 'INSERT INTO perso
这个问题在这里已经有了答案: String concatenation with a null seems to nullify the entire string - is that desire
您好,我正在 Android 联系人搜索模块中工作。我正在查询下方运行。 cur = context.getContentResolver().query(ContactsContract.Data.
下面的 SQL 表定义说明了从我的 MYSQL 数据库创建表的语句之一,该数据库是由我公司的前开发人员开发的。 DROP TABLE IF EXISTS `classifieds`.`category
我主要有应用程序开发背景。在编程语言中 variable == null或 variable != null有效。 当涉及到 SQL 时,以下查询不会给出任何语法错误,但也不会返回正确的结果。 sel
我在尝试检查某些元素是否为 NULL 时遇到段错误或不。任何人都可以帮忙吗? void addEdge(int i, int j) { if (i >= 0 && j > 0)
在 SQL 服务器中考虑到以下事实:Col1 和 Col2 包含数值和 NULL 值 SELECT COALESCE(Col1,Col2) 返回一个错误:“COALESCE 的至少一个参数必须是一个不
在 SQL 服务器中考虑到以下事实:Col1 和 Col2 包含数值和 NULL 值 SELECT COALESCE(Col1,Col2) 返回一个错误:“COALESCE 的至少一个参数必须是一个不
下面查询的关系代数表达式是什么?我找不到“Is Null”的表达式。 SELECT reader.name FROM reader LEFT JOIN book_borrow ON reader.ca
我正在尝试使用三元运算符来检查值是否为 null 并返回一个表达式或另一个。将此合并到 LINQ 表达式时,我遇到的是 LINQ 表达式的 Transact-SQL 转换试图执行“column = n
我在给定的代码中看到了以下行: select(0, (fd_set *) NULL, (fd_set *) NULL, (fd_set *) NULL, &timeout); http://linux
var re = /null/g; re.test('null null'); //> true re.test('null null'); //> true re.test('null null')
这个问题在这里已经有了答案: 关闭 13 年前。 我今天避开了一场关于数据库中空值的激烈辩论。 我的观点是 null 是未指定值的极好指示符。团队中有意见的其他每个人都认为零和空字符串是可行的方法。
由于此错误,我无法在模拟器中运行我的应用: Error:null value in entry: streamOutputFolder=null 或 gradle - Error:null value
我正在尝试在 Android 应用程序中创建电影数据库,但它返回错误。知道这意味着什么吗? public Cursor returnData() { return db.query(TABLE
我一直在检查浏览器中的日期函数以及运行时间 new Date (null, null, null); 在开发工具控制台中,它给出了有效的日期 Chrome v 61 回归 Sun Dec 31 189
为什么 NA==NULL 会导致 logical (0) 而不是 FALSE? 为什么 NULL==NULL 会导致 logical(0) 而不是 TRUE? 最佳答案 NULL 是一个“零长度”对象
我是一名优秀的程序员,十分优秀!