после загрузки вылетает - PullRequest
1 голос
/ 04 января 2012

Мое приложение использует службу загрузки. В службе мне нужно получить значения из базы данных, но приложение падает, когда оно пытается получить значения ...

Ошибка 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 (собственный метод) 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): at 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 (собственный метод) 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

Спасибо заранее ..............

my service.java // file

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

}

Ответы [ 5 ]

5 голосов
/ 05 января 2012

Когда вы создаете курсор из базы данных, вы должны сначала проверить оба значения (cursor != null && cursor.moveToFirst()).В вашем случае, если нет доступных данных, это создаст проблему.

, поэтому перед использованием курсора добавьте условие

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

java.lang.IllegalStateException: getслот поля из строки 0 col -1 не удалось

Обычно эту ошибку вы получите, если пытаетесь прочитать значение столбца из курсора, но этот столбец не существует в курсоре.

3 голосов
/ 05 января 2012

Ошибка говорит о том, что вы пытаетесь получить строку из столбца с индексом -1, который НЕПРАВИЛЬНЫЙ. Столбцы нумеруются начиная с 0. Как сказано в документе Google о Cursor.getColumnIndex (имя строки), он возвращает -1, если столбец с именем «name» не существует. Проверьте строку 69 вашего файла MyService.java:

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

Я думаю, что в вашей базе данных нет "безопасного" столбца. Проверьте вашу базу данных.

3 голосов
/ 04 января 2012

Из-за ошибки кажется, что вы извлекаете некоторый контент из Database в Cursor. Но для извлечения содержимого из Cursor вам нужно point the Cursor to the first row, которое содержит ваш курсор. Поэтому вам нужно применить cursor.moveToFirst();, чтобы это заработало, если это так. В противном случае вы должны опубликовать полный исходный код или код, где вы чувствуете его сбой.

2 голосов
/ 05 января 2012

Я нашел ответ на этот вопрос сам ...

ошибка, скорее сказать, моя ошибка в кодировании заключалась в том, что я должен был использовать moveToNext() вместо isAfterLast()

1 голос
/ 04 января 2012

Где находится база данных?И вы уверены, что у вас установлены разрешения?Кроме того, не могли бы вы опубликовать код в вашем классе MyService?

...