sub*_*n90 1 database sqlite boot service android
我的应用程序正在使用启动服务.在服务中我必须从数据库中获取值,但应用程序在尝试获取值时崩溃...
logcat错误列在下面...........
01-03 22:19:46.097:E/AndroidRuntime(240):FATAL EXCEPTION:main 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):at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:2087)01-03 22:19:46.097:E/AndroidRuntime(240):at 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):在android.database.CursorWindow.getString_native(本机方法)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):at 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-0 3 22:19:46.097:E/AndroidRuntime(240):在android.app.ActivityThread.handleCreateService(ActivityThread.java:2959)01-03 22:19:46.097:E/AndroidRuntime(240):... 10更多
Thanx提前..............
我的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;
    }
}
从数据库创建光标时,必须首先检查两者(cursor != null && cursor.moveToFirst()).在您的情况下,如果没有任何可用的数据,那么它将产生问题.
所以在使用Cursor之前添加条件
if(c != null && c.moveToFirst()) {
//write your code here
} 
java.lang.IllegalStateException:从第0行col -1获取字段槽失败
通常,如果您尝试从游标中读取列值但光标中不存在该列,则会出现此错误.