我的应用程序正在使用启动服务。在服务中我必须从数据库中获取值,但应用程序在尝试获取值时崩溃...
logcat错误列在下面...........
01-03 22:19:46.097:E / AndroidRuntime(240):致命异常:主要 01-03 22:19:46.097:E / AndroidRuntime(240):java.lang.RuntimeException:无法创建服务com.android.antitheft.MyService:java.lang.IllegalStateException:从第0行获取字段槽col -1失败 01-03 22:19:46.097:E / AndroidRuntime(240):在android.app.ActivityThread.handleCreateService(ActivityThread.java:2969) 01-03 22:19:46.097:E / AndroidRuntime(240):在android.app.ActivityThread.access $ 3300(ActivityThread.java:125) 01-03 22:19:46.097:E / AndroidRuntime(240):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:2087) 01-03 22:19:46.097:E / AndroidRuntime(240):在android.os.Handler.dispatchMessage(Handler.java:99) 01-03 22:19:46.097:E / AndroidRuntime(240):在android.os.Looper.loop(Looper.java:123) 01-03 22:19:46.097:E / AndroidRuntime(240):在android.app.ActivityThread.main(ActivityThread.java:4627) 01-03 22:19:46.097:E / AndroidRuntime(240):at java.lang.reflect.Method.invokeNative(Native Method) 01-03 22:19:46.097:E / AndroidRuntime(240):at java.lang.reflect.Method.invoke(Method.java:521) 01-03 22:19:46.097:E / AndroidRuntime(240):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868) 01-03 22:19:46.097:E / AndroidRuntime(240):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 01-03 22:19:46.097:E / AndroidRuntime(240):at dalvik.system.NativeStart.main(Native Method) 01-03 22:19:46.097:E / AndroidRuntime(240):引起:java.lang.IllegalStateException:从第0行获取字段槽col -1失败 01-03 22:19:46.097:E / AndroidRuntime(240):at android.database.CursorWindow.getString_native(Native Method) 01-03 22:19:46.097:E / AndroidRuntime(240):在android.database.CursorWindow.getString(CursorWindow.java:329) 01-03 22:19:46.097:E / AndroidRuntime(240):在android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:49) 01-03 22:19:46.097:E / AndroidRuntime(240):at com.android.antitheft.MyService.onCreate(MyService.java:69) 01-03 22:19:46.097:E / AndroidRuntime(240):在android.app.ActivityThread.handleCreateService(ActivityThread.java:2959) 01-03 22:19:46.097:E / AndroidRuntime(240):... 10 more
提前完成..............
我的service.java //文件
package com.android.antitheft;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.IBinder;
import android.telephony.TelephonyManager;
import android.telephony.SmsManager;
import android.util.Log;
import android.widget.Toast;
public class MyService extends Service {
SQLiteDatabase myDB;
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
super.onCreate();
System.out.println("@@@@@@@@@@@OnCreate1111");
Toast.makeText(this, "Service Created", Toast.LENGTH_LONG).show();
myDB = MyService.this.openOrCreateDatabase("antitheft", MODE_PRIVATE, null);
Cursor cursor1 = myDB.query("SimSerial", null, null, null, null, null, null);
cursor1.moveToLast();
//cursor1.moveToFirst();
String ss1 = cursor1.getString(cursor1.getColumnIndex("simno"));
Toast.makeText(this, "FROM DATABASE: SIM SERIAL "+ss1, Toast.LENGTH_LONG).show();
cursor1.close();
myDB.close();
// cursor2.moveToNext();
// String num2 = cursor2.getString(cursor2.getColumnIndex("secure"));
//
// cursor2.moveToNext();
// String num3 = cursor2.getString(cursor2.getColumnIndex("secure"));
TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
String ss=tm.getSimSerialNumber();
Log.v("SERVICE", ss);
Toast.makeText(this, "Service started : SIM SERIAL "+ss, Toast.LENGTH_LONG).show();
Log.v("StartServiceAtBoot", "StartAtBootService -- onStartCommand()");
if(ss.equals(ss1))
{
SmsManager sms = SmsManager.getDefault();
// sms.sendTextMessage("5556", null, "message", null, null);
Toast.makeText(this, "INSIDE iffffffffffff ", Toast.LENGTH_LONG).show();
myDB = MyService.this.openOrCreateDatabase("antitheft", MODE_PRIVATE, null);
Cursor cursor2 = myDB.query("SimSerial", null, null, null, null, null, null);
cursor2.moveToFirst();
while (cursor2.isAfterLast() == false) {
String num1 = cursor2.getString(cursor2.getColumnIndex("secure"));
sms.sendTextMessage(num1, null, "message", null, null);
cursor2.moveToNext();
}
cursor2.close();
myDB.close();
// sms.sendTextMessage(num1, null, "message", null, null);
// sms.sendTextMessage(num2, null, "message", null, null);
// sms.sendTextMessage(num3, null, "message", null, null);
}
// else
//
// {
// SmsManager sms = SmsManager.getDefault();
// sms.sendTextMessage("5556", null, "message", null, null);
//
// Toast.makeText(this, "INSIDE elseeeeeeeeeeeeee", Toast.LENGTH_LONG).show();
// }
}
@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
// We want this service to continue running until it is explicitly
// stopped, so return sticky.
return START_STICKY;
}
}
答案 0 :(得分:5)
从数据库创建光标时,您必须首先检查(cursor != null && cursor.moveToFirst())
。在您的情况下,如果没有任何可用的数据,那么它将产生问题。
所以在使用Cursor之前添加条件
if(c != null && c.moveToFirst()) {
//write your code here
}
java.lang.IllegalStateException:从第0行col -1获取字段槽 失败
通常,如果您尝试从游标中读取列值但光标中不存在该列,则会出现此错误。
答案 1 :(得分:3)
从错误中看,您似乎从Database
中的Cursor
获取了一些内容。但是从您需要的Cursor
中获取光标所包含的point the Cursor to the first row
内容。因此,如果是这种情况,您需要应用cursor.moveToFirst();
才能使其正常运行。否则,您应该发布您觉得崩溃的完整源代码或代码。
答案 2 :(得分:3)
错误表示您正在尝试从索引为-1的列中接收字符串,该列为错误。 列从0开始枚举。如谷歌的doc说明Cursor.getColumnIndex(String name),如果名称“name”的列不存在,则返回-1。 检查MyService.java文件的第69行:
String num1 = cursor2.getString(cursor2.getColumnIndex("secure"));
我认为您的数据库中没有“安全”列。验证您的数据库。
答案 3 :(得分:2)
我自己找到了答案......
错误,而不是说;我在编码中的错误是我应该使用moveToNext()
代替isAfterLast()
答案 4 :(得分:1)
数据库位于何处?你确定你设置了你的权限吗?另外,您可以将代码发布到MyService类吗?