2012-01-04 86 views
1

我的應用程序是使用在啓動service.In服務我不得不從數據庫中獲取的值,但應用程序崩潰,因爲它試圖獲取值...啓動後,轟然

被列出的logcat的錯誤下面...........

01-03 22:19:46.0​​97:E/AndroidRuntime(240):致命異常:主 01-03 22:19:46.0​​97:E/AndroidRuntime(240):java.lang.RuntimeException:無法創建服務com.android.antitheft.MyService:java.lang.IllegalStateException:從行0獲得字段插槽col -1失敗 01-03 22:19:46.0​​97:E/AndroidRuntime(240):at android.app.ActivityTh read.handleCreateService(ActivityThread.java:2969) 01-03 22:19:46.0​​97:E/AndroidRuntime(240):at android.app.ActivityThread.access $ 3300(ActivityThread.java:125) 01-03 22:19 :46.0​​97:E/AndroidRuntime(240):at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:2087) 01-03 22:19:46.0​​97:E/AndroidRuntime(240):at android.os.Handler .dispatchMessage(Handler.java:99) 01-03 22:19:46.0​​97:E/AndroidRuntime(240):at android.os.Looper.loop(Looper.java:123) 01-03 22:19:46.0​​97 :E/AndroidRuntime(240):at android.app.ActivityThread.main(ActivityThread.java:4627) 01-03 22:19:46.0​​97:E/AndroidRuntime(240):at java.lang.reflect.Method.invokeNative (Native Method) 01-03 22:19:46.0​​97:E/AndroidRuntime(240):at java.lang.reflect.Method.invoke(Method.java:521) 01-03 22:19:46.0​​97:E/AndroidRuntime(240):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868) 01-03 22:19:46.0​​97:E/AndroidRuntime(240):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 01-03 22:19:46.0​​97:E/AndroidRuntime(240):at dalvik.system.NativeStart.main(本地方法) 01-03 22:19:46.0​​97:E/AndroidRuntime(240):引起:java.lang.IllegalStateException:從行0獲得字段插槽col -1失敗 01-03 22:19:46.0​​97:E/AndroidRuntime(240):at android.database.CursorWindow.getString_native(Native Method) 01-03 22:19:46.0​​97:E/AndroidRuntime(240):at android.database.CursorWindow.getString(CursorWindow.java:329) 01-03 22:19:46.0​​97:E/AndroidRuntime(240):at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:4 9) 01-03 22:19:46.0​​97:E/AndroidRuntime(240):at com.android.antitheft.MyService.onCreate(MyService.java:69) 01-03 22:19:46.0​​97:E/AndroidRuntime 240):在android.app.ActivityThread.handleCreateService(ActivityThread.java:2959) 01-03 22:19:46.0​​97: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; 
    } 

}

回答

2

我找到了答案,這個自己...

錯誤,不如說,我的編碼錯誤是,我本來是要使用的moveToNext()代替isAfterLast()

3

從錯誤看來,您正在從的Cursor中獲取一些內容。但是從Cursor獲取內容,您需要使用光標包含的point the Cursor to the first row。所以你需要申請cursor.moveToFirst();才能使它工作,如果是這樣的話。否則,你應該發佈完整的源代碼或者你感覺崩潰的代碼。

1

數據庫位於何處?你確定你有權限嗎?另外,你可以將代碼發佈到你的MyService類嗎?

+0

玉拜菲爾德我已經發布我的服務類 – subrussn90 2012-01-04 06:45:08

5

當您從數據庫創建光標時,您必須首先檢查兩個(cursor != null && cursor.moveToFirst())。在你的情況下,如果沒有任何數據可用,那麼它會產生一個問題。

使用光標添加條件

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

java.lang.IllegalStateException:從行0山坳得到場插槽-1 失敗

通常這個錯誤,你會得到如果您嘗試從光標讀取列值,但該列不存在於光標中。

3

錯誤說,你正試圖從與指數-1列這是錯誤的字符串。 列列舉了從0開始谷歌的醫生說大約Cursor.getColumnIndex(字符串名稱),則返回-1,如果有「名」的名稱列不存在。 檢查MyService.java文件的第69行:

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

我認爲這是在你的數據庫中沒有「安全」欄。驗證你的數據庫。