安卓:在返回数量SQLite数据库崩溃 [英] Android: SQLite database crashes on returning a quantity

查看:141
本文介绍了安卓:在返回数量SQLite数据库崩溃的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

数据库保存的名称和药物的数量...需要什么要返回是对应于被扫描的药物的数量。
code数据库:

 公共类ToolDB {    公共静态最后弦乐KEY_ROWID =ID;
    公共静态最后弦乐KEY_NAME =名;
    公共静态最后弦乐KEY_QUANTITY =量;
    私有静态最后弦乐TAG =DBAdapter;    私有静态最后弦乐DATABASE_NAME =Medicine_Database;
    私有静态最后弦乐DATABASE_TABLE =meds_db;
    私有静态最终诠释DATABASE_VERSION = 2;    私有静态最后弦乐DATABASE_CREATE =
            创建表,如果不存在meds_db(ID整数主键自动增量
             +名VARCHAR NOT NULL,数量VARCHAR);;
    公共字符串QuantReturn(){        UserInput X =新UserInput();
        字符串Y = x.QR codeReturn();        字符串量=无效;
        字符串selectQuery =SELECT量从meds_db其中name =+ Y;
        光标C = db.rawQuery(selectQuery,NULL);        如果(零= C和;!&放大器; c.moveToFirst()){
            量= c.getString(c.getColumnIndex(KEY_QUANTITY));
        }
        返回数量;
    }

QR codeReturn()方法的工作,当你对自己的运行它,它返回从QR code读取正确的字符串。

类执行时崩溃:

 公共类测试扩展活动{@覆盖
保护无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_testing);    ToolDB DB =新ToolDB(本);         db.open();
         串C1 = db.QuantReturn();
         db.close();
         TextView的T3 =(的TextView)findViewById(R.id.slot4);
         t3.setText(C1);}

LogCat中发生错误:

  03-18 21:24:58.310:E / AndroidRuntime(14192):致命异常:主要
03-18 21:24:58.310:E / AndroidRuntime(14192):了java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.SurgicalMate / com.example.SurgicalMate.Testing}:显示java.lang.NullPointerException
03-18 21:24:58.310:E / AndroidRuntime(14192):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2351)
03-18 21:24:58.310:E / AndroidRuntime(14192):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
03-18 21:24:58.310:E / AndroidRuntime(14192):在android.app.ActivityThread.access $ 600(ActivityThread.java:151)
03-18 21:24:58.310:E / AndroidRuntime(14192):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1331)
03-18 21:24:58.310:E / AndroidRuntime(14192):在android.os.Handler.dispatchMessage(Handler.java:99)
03-18 21:24:58.310:E / AndroidRuntime(14192):在android.os.Looper.loop(Looper.java:155)
03-18 21:24:58.310:E / AndroidRuntime(14192):在android.app.ActivityThread.main(ActivityThread.java:5454)
03-18 21:24:58.310:E / AndroidRuntime(14192):在java.lang.reflect.Method.invokeNative(本机方法)
03-18 21:24:58.310:E / AndroidRuntime(14192):在java.lang.reflect.Method.invoke(Method.java:511)
03-18 21:24:58.310:E / AndroidRuntime(14192):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1029)
03-18 21:24:58.310:E / AndroidRuntime(14192):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:796)
03-18 21:24:58.310:E / AndroidRuntime(14192):在dalvik.system.NativeStart.main(本机方法)
03-18 21:24:58.310:E / AndroidRuntime(14192):致:显示java.lang.NullPointerException
03-18 21:24:58.310:E / AndroidRuntime(14192):在android.content.ContextWrapper.getShared preferences(ContextWrapper.java:153)
03-18 21:24:58.310:E / AndroidRuntime(14192):在com.example.SurgicalMate.UserInput.QR codeReturn(UserInput.java:76)
03-18 21:24:58.310:E / AndroidRuntime(14192):在com.example.SurgicalMate.ToolDB.QuantReturn(ToolDB.java:78)
03-18 21:24:58.310:E / AndroidRuntime(14192):在com.example.SurgicalMate.Testing.onCreate(Testing.java:24)
03-18 21:24:58.310:E / AndroidRuntime(14192):在android.app.Activity.performCreate(Activity.java:5066)
03-18 21:24:58.310:E / AndroidRuntime(14192):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1101)
03-18 21:24:58.310:E / AndroidRuntime(14192):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2307)
03-18 21:24:58.310:E / AndroidRuntime(14192):... 11个

QR codeReturn()方法返回一个字符串。我在其他地方测试,它一直工作正常。

 公共字符串QR codeReturn(){    共享preferences codeHACK = getShared preferences(SCAN_RESULT,0);
    字符串QR code = codeHack.getString(项,未登记);    返回QR code;
}


解决方案

QR codeReturn(),因为它是现在才能正常工作,如果它有一个适当的上下文(它需要它 getShared preferences()梅托德工作)。它不会从类`ToolDB工作。

您应该:​​


  • 要么通过一个上下文参数,将其

  • 使用 ToolDB 上课前
  • 或交替运行您的活动这种方法,并通过所获得的值 ToolDB 类。

例如:

 公共字符串QR codeReturn(上下文的背景下){    共享preferences codeHACK = context.getShared preferences(SCAN_RESULT,0);
    字符串QR code = codeHack.getString(项,未登记);    返回QR code;
}

然后,您可以使用它从活动:

 字符串code = QR codeReturn(本);

QuantReturn()

 公共字符串QuantReturn(上下文的背景下){   ...
   字符串Y = x.QR codeReturn(背景);
   ...
}

Database holds name and quantity of medication... what is required to be returned is the quantity corresponding to the medication which is scanned. code for database:

public class ToolDB {

    public static final String KEY_ROWID = "id";
    public static final String KEY_NAME = "name";
    public static final String KEY_QUANTITY = "quantity";
    private static final String TAG = "DBAdapter";

    private static final String DATABASE_NAME = "Medicine_Database";
    private static final String DATABASE_TABLE = "meds_db";
    private static final int DATABASE_VERSION = 2;

    private static final String DATABASE_CREATE =
            "create table if not exists meds_db (id integer primary key autoincrement, "
             + "name VARCHAR not null, quantity VARCHAR);";


    public String QuantReturn(){

        UserInput x = new UserInput();
        String y = x.QRcodeReturn();

        String quantity=null;
        String selectQuery = "SELECT quantity FROM meds_db WHERE name = " + y;
        Cursor c = db.rawQuery(selectQuery, null);

        if(null != c && c.moveToFirst()){
            quantity  = c.getString(c.getColumnIndex(KEY_QUANTITY));
        }
        return quantity;
    }

QRcodeReturn() method works when you run it on its own and it returns the proper string read from a QR code.

class that crashes when executed:

public class Testing extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_testing);

    ToolDB db = new ToolDB(this);

         db.open();
         String c1 = db.QuantReturn();
         db.close();


         TextView t3 = (TextView) findViewById(R.id.slot4);
         t3.setText(c1);

}

Logcat where the error occurs:

03-18 21:24:58.310: E/AndroidRuntime(14192): FATAL EXCEPTION: main
03-18 21:24:58.310: E/AndroidRuntime(14192): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.SurgicalMate/com.example.SurgicalMate.Testing}: java.lang.NullPointerException
03-18 21:24:58.310: E/AndroidRuntime(14192):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2351)
03-18 21:24:58.310: E/AndroidRuntime(14192):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
03-18 21:24:58.310: E/AndroidRuntime(14192):    at android.app.ActivityThread.access$600(ActivityThread.java:151)
03-18 21:24:58.310: E/AndroidRuntime(14192):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1331)
03-18 21:24:58.310: E/AndroidRuntime(14192):    at android.os.Handler.dispatchMessage(Handler.java:99)
03-18 21:24:58.310: E/AndroidRuntime(14192):    at android.os.Looper.loop(Looper.java:155)
03-18 21:24:58.310: E/AndroidRuntime(14192):    at android.app.ActivityThread.main(ActivityThread.java:5454)
03-18 21:24:58.310: E/AndroidRuntime(14192):    at java.lang.reflect.Method.invokeNative(Native Method)
03-18 21:24:58.310: E/AndroidRuntime(14192):    at java.lang.reflect.Method.invoke(Method.java:511)
03-18 21:24:58.310: E/AndroidRuntime(14192):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029)
03-18 21:24:58.310: E/AndroidRuntime(14192):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:796)
03-18 21:24:58.310: E/AndroidRuntime(14192):    at dalvik.system.NativeStart.main(Native Method)
03-18 21:24:58.310: E/AndroidRuntime(14192): Caused by: java.lang.NullPointerException
03-18 21:24:58.310: E/AndroidRuntime(14192):    at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:153)
03-18 21:24:58.310: E/AndroidRuntime(14192):    at com.example.SurgicalMate.UserInput.QRcodeReturn(UserInput.java:76)
03-18 21:24:58.310: E/AndroidRuntime(14192):    at com.example.SurgicalMate.ToolDB.QuantReturn(ToolDB.java:78)
03-18 21:24:58.310: E/AndroidRuntime(14192):    at com.example.SurgicalMate.Testing.onCreate(Testing.java:24)
03-18 21:24:58.310: E/AndroidRuntime(14192):    at android.app.Activity.performCreate(Activity.java:5066)
03-18 21:24:58.310: E/AndroidRuntime(14192):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1101)
03-18 21:24:58.310: E/AndroidRuntime(14192):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2307)
03-18 21:24:58.310: E/AndroidRuntime(14192):    ... 11 more

QRcodeReturn() method returns a string.. I have tested it elsewhere and it has worked correctly.

public String QRcodeReturn(){

    SharedPreferences codeHack = getSharedPreferences(SCAN_RESULT,0);
    String QRcode = codeHack.getString("entry", "unregistered");

    return QRcode;
}

解决方案

QRcodeReturn() as it is now will only work correctly if it has a proper Context (it needs it for getSharedPreferences() metod to work). It won't work from class `ToolDB.

You should :

  • either pass a Context parameter to it
  • or alternatively run this method from your activity before using ToolDB class and pass the obtained value to ToolDB class.

For example:

public String QRcodeReturn(Context context){

    SharedPreferences codeHack = context.getSharedPreferences(SCAN_RESULT,0);
    String QRcode = codeHack.getString("entry", "unregistered");

    return QRcode;
}

You can then use it from the activity:

String code = QRcodeReturn(this);

and from QuantReturn():

public String QuantReturn(Context context){

   ...
   String y = x.QRcodeReturn(context);
   ...
}

这篇关于安卓:在返回数量SQLite数据库崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆