【问题标题】:after bootup,crashing启动后,崩溃
【发布时间】:2012-01-04 06:24:10
【问题描述】:

我的应用程序正在使用启动服务。在该服务中,我必须从数据库中获取值,但应用程序在尝试获取值时崩溃了...

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): 在 java.lang.reflect.Method.invokeNative(Native Method) 01-03 22:19:46.097: E/AndroidRuntime(240): 在 java.lang.reflect.Method.invoke(Method.java:521) 01-03 22:19:46.097: E/AndroidRuntime(240): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 01-03 22:19:46.097: E/AndroidRuntime(240): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 01-03 22:19:46.097:E/AndroidRuntime(240):在 dalvik.system.NativeStart.main(本机方法) 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(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): 在 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 更多

提前谢谢......

我的 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;
    }

}

【问题讨论】:

    标签: android database sqlite service boot


    【解决方案1】:

    当您从数据库创建游标时,您必须首先检查(cursor != null && cursor.moveToFirst())。在您的情况下,如果没有任何可用数据,那么它将产生问题。

    所以在使用光标之前添加条件

    if(c != null && c.moveToFirst()) {
    //write your code here
    } 
    

    java.lang.IllegalStateException:从第 0 行 col -1 获取字段槽 失败

    如果您尝试从游标中读取列值但游标中不存在该列,通常会出现此错误。

    【讨论】:

      【解决方案2】:

      从错误看来,您正在从Cursor 中的Database 获取一些内容。但是从Cursor 中获取内容需要您的光标包含的point the Cursor to the first row。因此,如果是这种情况,您需要申请 cursor.moveToFirst(); 以使其正常工作。否则,您应该发布完整的源代码或您认为崩溃的代码。

      【讨论】:

        【解决方案3】:

        错误表示您正试图从索引为 -1 的列接收字符串,这是错误的。 列从 0 开始枚举。正如 google 的文档所说的 Cursor.getColumnIndex(String name),如果具有“name”名称的列不存在,则返回 -1。 检查 MyService.java 文件的第 69 行:

        String num1 = cursor2.getString(cursor2.getColumnIndex("secure"));
        

        我认为您的数据库中没有“安全”列。验证您的数据库。

        【讨论】:

          【解决方案4】:

          我自己找到了答案……

          错误,而是说;我在编码中的错误是我应该使用moveToNext() 而不是isAfterLast()

          【讨论】:

            【解决方案5】:

            数据库位于何处?你确定你设置了权限吗?另外,您可以将代码发布到您的 MyService 类吗?

            【讨论】:

            • Jade Byfield 我已经发布了我的服务类
            猜你喜欢
            • 2012-01-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-02-16
            • 2013-04-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多