Android的游标错误:确保光标从它访问数据之前正确初始化 [英] Android cursor Error : Make sure the Cursor is initialized correctly before accessing data from it
本文介绍了Android的游标错误:确保光标从它访问数据之前正确初始化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我要执行以获取字符串的记录方法,但是当涉及到执行,原来运行时错误的登录猫说。请您告诉我们如何正确地初始化光标?
logcat的
10月7日至八日:10:34.620:D /结果(8036):真
10月7日至8日:10:34.660:D / memalloc(8036):离子:取消映射缓冲碱:0x57c06000大小:466944
10月7日至8日:10:34.660:D / memalloc(8036):离子:取消映射缓冲碱:0x57d6c000大小:466944
10月7日至8日:10:34.660:D / memalloc(8036):离子:取消映射缓冲碱:0x57cbb000大小:466944
10月7日至8日:10:34.710:D /调试(8036):订单87318702
10月7日至8日:10:34.710:D / pcDbHelper(8036):pcDbHelper com.example.recordandmovie.PhotoDbAdapter@412cad30
10月7日至8日:10:34.841:W / CursorWindow(8036):窗口已满:请求的分配1249663字节可用空间398939字节,窗口大小2097152字节
10月7日至8日:10:34.931:W / CursorWindow(8036):窗口已满:请求的分配1249663字节可用空间398939字节,窗口大小2097152字节
10月7日至8日:10:34.941:D /调试光标(8036):可以创建
10月7日至8日:10:34.941:E / CursorWindow(8036):无法从其中有0行4列的CursorWindow读取0行1列。
10月7日至8日:10:34.941:W / dalvikvm(8036):主题ID = 1:螺纹未捕获的异常(组= 0x40c051f8)退出
10月7日至8日:10:34.951:E / AndroidRuntime(8036):致命异常:主要
10月7日至8日:10:34.951:E / AndroidRuntime(8036):了java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.recordandmovie / com.example.recordandmovie.Main6}:java.lang.IllegalStateException:Couldn 'T从CursorWindow读行0,第1栏。确保光标从它访问数据之前正确初始化。
10月7日至8日:10:34.951:E / AndroidRuntime(8036):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1968)
10月7日至8日:10:34.951:E / AndroidRuntime(8036):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1993)
10月7日至8日:10:34.951:E / AndroidRuntime(8036):在android.app.ActivityThread.access $ 600(ActivityThread.java:127)
10月7日至8日:10:34.951:E / AndroidRuntime(8036):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1159)
10月7日至8日:10:34.951:E / AndroidRuntime(8036):在android.os.Handler.dispatchMessage(Handler.java:99)
10月7日至8日:10:34.951:E / AndroidRuntime(8036):在android.os.Looper.loop(Looper.java:137)
10月7日至8日:10:34.951:E / AndroidRuntime(8036):在android.app.ActivityThread.main(ActivityThread.java:4519)
10月7日至8日:10:34.951:E / AndroidRuntime(8036):在java.lang.reflect.Method.invokeNative(本机方法)
10月7日至8日:10:34.951:E / AndroidRuntime(8036):在java.lang.reflect.Method.invoke(Method.java:511)
10月7日至8日:10:34.951:E / AndroidRuntime(8036):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:794)
10月7日至8日:10:34.951:E / AndroidRuntime(8036):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:561)
10月7日至8日:10:34.951:E / AndroidRuntime(8036):在dalvik.system.NativeStart.main(本机方法)
10月7日至8日:10:34.951:E / AndroidRuntime(8036):java.lang.IllegalStateException:产生的原因无法从CursorWindow读取0行,第1栏。确保光标从它访问数据之前正确初始化。
10月7日至8日:10:34.951:E / AndroidRuntime(8036):在android.database.CursorWindow.nativeGetString(本机方法)
10月7日至8日:10:34.951:E / AndroidRuntime(8036):在android.database.CursorWindow.getString(CursorWindow.java:450)
10月7日至8日:10:34.951:E / AndroidRuntime(8036):在android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
10月7日至8日:10:34.951:E / AndroidRuntime(8036):在com.example.recordandmovie.Main6.onCreate(Main6.java:39)
10月7日至8日:10:34.951:E / AndroidRuntime(8036):在android.app.Activity.performCreate(Activity.java:4485)
10月7日至8日:10:34.951:E / AndroidRuntime(8036):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052)
下面是我的工作。
进口android.app.Activity;
进口android.content.Intent;
进口android.database.Cursor;
进口android.util.Log;
进口android.view.Menu;公共类Main6延伸活动{ 私人PhotoDbAdapter pcDbHelper;
私人字符串orderidGenerated; @覆盖
保护无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_main6); 意向意图= getIntent(); 如果(意向!= NULL){
orderidGenerated = intent.getStringExtra(订单);
} Log.d(调试,订单+ orderidGenerated); 如果(pcDbHelper == NULL){
pcDbHelper =新PhotoDbAdapter(本);
pcDbHelper.open();
} Log.d(pcDbHelper,pcDbHelper+ pcDbHelper);
光标CUR = pcDbHelper.fetchOrderByRef(orderidGenerated);
如果(CUR!= NULL){
cur.moveToFirst(); Log.d(调试光标,可制作);
Log.d(KEY_PHOTO_HKID_HEX,cur.getString(1));
Log.d(KEY_PHOTO_ADDRESS_HEX,cur.getString(2));
Log.d(KEY_PHOTO_BANK_HEX,cur.getString(3));
startManagingCursor(现); cur.close();
}其他{
Log.d(调试光标,无法创建);
}
}}
公共光标fetchOrderByRef(字符串Personal Data个人纪录)抛出的SQLException { 光标mCursor = mDb.query(真,DATABASE_TABLE,新的String [] {
KEY_REFNO,
KEY_PHOTO_HKID_HEX,
KEY_PHOTO_ADDRESS_HEX,
KEY_PHOTO_BANK_HEX
},KEY_REFNO +=+ Personal Data个人纪录,
NULL,NULL,NULL,NULL,NULL); 返回mCursor;}
解决方案
该错误消息说
无法从其中有0行4列的CursorWindow读取0行1列。
块引用>所以你的查询返回0行。你的if语句应该是:
如果(CUR!= NULL){
//最好地管理任何非空指针的那么它将被关闭时,
//活动停止
startManagingCursor(现);
//只有一排被发现
如果(cur.moveToFirst()){
Log.d(调试光标,可制作);
Log.d(KEY_PHOTO_HKID_HEX,cur.getString(1));
Log.d(KEY_PHOTO_ADDRESS_HEX,cur.getString(2));
Log.d(KEY_PHOTO_BANK_HEX,cur.getString(3));
}其他{
//处理不返回的行
}
}其他{
Log.d(调试光标,无法创建);
}I am going to implement the method to retrieve the record of the strings but when it comes to the execution , it turns Runtime Error as the Log cat stated. Would you please tell us how in correctly initialise the cursor ?
Logcat
07-08 10:10:34.620: D/result(8036): true 07-08 10:10:34.660: D/memalloc(8036): ion: Unmapping buffer base:0x57c06000 size:466944 07-08 10:10:34.660: D/memalloc(8036): ion: Unmapping buffer base:0x57d6c000 size:466944 07-08 10:10:34.660: D/memalloc(8036): ion: Unmapping buffer base:0x57cbb000 size:466944 07-08 10:10:34.710: D/debug(8036): Order 87318702 07-08 10:10:34.710: D/pcDbHelper(8036): pcDbHelper com.example.recordandmovie.PhotoDbAdapter@412cad30 07-08 10:10:34.841: W/CursorWindow(8036): Window is full: requested allocation 1249663 bytes, free space 398939 bytes, window size 2097152 bytes 07-08 10:10:34.931: W/CursorWindow(8036): Window is full: requested allocation 1249663 bytes, free space 398939 bytes, window size 2097152 bytes 07-08 10:10:34.941: D/debug Cursor(8036): can be created 07-08 10:10:34.941: E/CursorWindow(8036): Failed to read row 0, column 1 from a CursorWindow which has 0 rows, 4 columns. 07-08 10:10:34.941: W/dalvikvm(8036): threadid=1: thread exiting with uncaught exception (group=0x40c051f8) 07-08 10:10:34.951: E/AndroidRuntime(8036): FATAL EXCEPTION: main 07-08 10:10:34.951: E/AndroidRuntime(8036): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.recordandmovie/com.example.recordandmovie.Main6}: java.lang.IllegalStateException: Couldn't read row 0, col 1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. 07-08 10:10:34.951: E/AndroidRuntime(8036): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1968) 07-08 10:10:34.951: E/AndroidRuntime(8036): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1993) 07-08 10:10:34.951: E/AndroidRuntime(8036): at android.app.ActivityThread.access$600(ActivityThread.java:127) 07-08 10:10:34.951: E/AndroidRuntime(8036): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1159) 07-08 10:10:34.951: E/AndroidRuntime(8036): at android.os.Handler.dispatchMessage(Handler.java:99) 07-08 10:10:34.951: E/AndroidRuntime(8036): at android.os.Looper.loop(Looper.java:137) 07-08 10:10:34.951: E/AndroidRuntime(8036): at android.app.ActivityThread.main(ActivityThread.java:4519) 07-08 10:10:34.951: E/AndroidRuntime(8036): at java.lang.reflect.Method.invokeNative(Native Method) 07-08 10:10:34.951: E/AndroidRuntime(8036): at java.lang.reflect.Method.invoke(Method.java:511) 07-08 10:10:34.951: E/AndroidRuntime(8036): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794) 07-08 10:10:34.951: E/AndroidRuntime(8036): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:561) 07-08 10:10:34.951: E/AndroidRuntime(8036): at dalvik.system.NativeStart.main(Native Method) 07-08 10:10:34.951: E/AndroidRuntime(8036): Caused by: java.lang.IllegalStateException: Couldn't read row 0, col 1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. 07-08 10:10:34.951: E/AndroidRuntime(8036): at android.database.CursorWindow.nativeGetString(Native Method) 07-08 10:10:34.951: E/AndroidRuntime(8036): at android.database.CursorWindow.getString(CursorWindow.java:450) 07-08 10:10:34.951: E/AndroidRuntime(8036): at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51) 07-08 10:10:34.951: E/AndroidRuntime(8036): at com.example.recordandmovie.Main6.onCreate(Main6.java:39) 07-08 10:10:34.951: E/AndroidRuntime(8036): at android.app.Activity.performCreate(Activity.java:4485) 07-08 10:10:34.951: E/AndroidRuntime(8036): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052)
Below is my working
import android.app.Activity; import android.content.Intent; import android.database.Cursor; import android.util.Log; import android.view.Menu; public class Main6 extends Activity { private PhotoDbAdapter pcDbHelper; private String orderidGenerated; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main6); Intent intent = getIntent(); if(intent!=null){ orderidGenerated = intent.getStringExtra("order"); } Log.d("debug" , "Order " + orderidGenerated); if(pcDbHelper ==null){ pcDbHelper = new PhotoDbAdapter(this); pcDbHelper.open(); } Log.d("pcDbHelper" , "pcDbHelper " + pcDbHelper); Cursor cur = pcDbHelper.fetchOrderByRef(orderidGenerated); if(cur!=null){ cur.moveToFirst(); Log.d("debug Cursor" , "can be created"); Log.d("KEY_PHOTO_HKID_HEX" , cur.getString(1)); Log.d("KEY_PHOTO_ADDRESS_HEX" , cur.getString(2)); Log.d("KEY_PHOTO_BANK_HEX" , cur.getString(3)); startManagingCursor(cur); cur.close(); }else{ Log.d("debug Cursor" , "cannot be created"); } } } public Cursor fetchOrderByRef(String refno) throws SQLException { Cursor mCursor = mDb.query(true, DATABASE_TABLE, new String[] { KEY_REFNO , KEY_PHOTO_HKID_HEX , KEY_PHOTO_ADDRESS_HEX , KEY_PHOTO_BANK_HEX },KEY_REFNO + "=" + refno, null, null, null, null, null); return mCursor; }
解决方案The error message says
Failed to read row 0, column 1 from a CursorWindow which has 0 rows, 4 columns.
So your query is returning 0 rows. Your if statement should read:
if(cur!=null){ // Best to manage any non-null cursor as then it will be closed when the // activity is stopped startManagingCursor(cur); // Only if a row was found if(cur.moveToFirst()) { Log.d("debug Cursor" , "can be created"); Log.d("KEY_PHOTO_HKID_HEX" , cur.getString(1)); Log.d("KEY_PHOTO_ADDRESS_HEX" , cur.getString(2)); Log.d("KEY_PHOTO_BANK_HEX" , cur.getString(3)); }else{ // Handle no rows returned } }else{ Log.d("debug Cursor" , "cannot be created"); }
这篇关于Android的游标错误:确保光标从它访问数据之前正确初始化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文