启动后崩溃
我的应用程序正在使用启动服务。在该服务中,我必须从数据库获取值,但应用程序在尝试获取值时崩溃...
下面列出了 logcat 错误.............. 。
01-03 22:19:46.097: E/AndroidRuntime(240): 致命异常: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): 在 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(本机方法) 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(本机方法) 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 更多
提前 10 个以上..............
我的 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;
}
}
My application is using a bootup service.In the service i have to get values from a database,but the app is crashing as it tries getting the values...
The logcat error is listed below...........
01-03 22:19:46.097: E/AndroidRuntime(240): FATAL EXCEPTION: main
01-03 22:19:46.097: E/AndroidRuntime(240): java.lang.RuntimeException: Unable to create service com.android.antitheft.MyService: java.lang.IllegalStateException: get field slot from row 0 col -1 failed
01-03 22:19:46.097: E/AndroidRuntime(240): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2969)
01-03 22:19:46.097: E/AndroidRuntime(240): at 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): at android.os.Looper.loop(Looper.java:123)
01-03 22:19:46.097: E/AndroidRuntime(240): at 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): Caused by: java.lang.IllegalStateException: get field slot from row 0 col -1 failed
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): at 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-03 22:19:46.097: E/AndroidRuntime(240): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2959)
01-03 22:19:46.097: E/AndroidRuntime(240): ... 10 more
Thanx in advance..............
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;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
当您从数据库创建游标时,您必须首先检查
(cursor != null &&cursor.moveToFirst())
。在您的情况下,如果没有任何可用数据,那么就会产生问题。所以在使用 Cursor 之前添加条件
通常,如果您尝试从游标读取列值,但游标中不存在该列,则会出现此错误。
When you Create Cursor from the Database you have to first check for both
(cursor != null && cursor.moveToFirst())
. In your case if there is no any data available then it will create a problem.so before you use Cursor add the condition
Normally this error you will get if you are trying to read a column value from the cursor but that column is not exists in the cursor.
从错误来看,您似乎正在从
Cursor
中的Database
获取一些内容。但是,要从光标
中获取内容,您需要将光标指向光标包含的第一行
。因此,如果是这种情况,您需要应用cursor.moveToFirst();
才能使其正常工作。否则,您应该发布完整的源代码或您认为崩溃的代码。From the error it seems that you are fetching some content from the
Database
in theCursor
. But fetching the content from theCursor
you need topoint the Cursor to the first row
that your cursor contains. So you need to applycursor.moveToFirst();
to get it working, if this is the case. Else you should post the full source or the code where you feel its crashing.该错误表明您正在尝试从索引为 -1 的列接收字符串,这是错误的。
列从 0 开始枚举。正如 google 的文档所说的 Cursor.getColumnIndex(String name) ,如果具有“name”名称的列不存在,它将返回 -1。
检查 MyService.java 文件的第 69 行:
我认为您的数据库中没有“安全”列。验证您的数据库。
The error says that you are trying to receive the string from the column with index -1 which is WRONG.
Columns are enumerated starting from 0. As google's doc says about Cursor.getColumnIndex(String name), it returns -1 if the column with "name" name doesn't exist.
Check the line 69 of your MyService.java file:
I think there is no "secure" column in your database. Verify your database.
我自己找到了答案......
错误,或者说;我在编码中的错误是我应该使用
moveToNext()
而不是isAfterLast()
I found the answer for this myself...
the error,rather say;my mistake in coding was that i was supposed to use
moveToNext()
instead ofisAfterLast()
数据库位于哪里?您确定您已设置权限吗?另外,您可以将代码发布到您的 MyService 类吗?
Where is the database located? And are you sure you have your permissions set? Also, could you post the code to your MyService Class?