Android:SQLite数据库在返回数量时崩溃

时间:2014-03-19 01:43:49

标签: android sqlite

数据库保存药物的名称和数量......需要返回的是与扫描的药物相对应的数量。 数据库代码:

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()方法在您自己运行时会起作用,并返回从QR码读取的正确字符串。

执行时崩溃的类:

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:

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()方法返回一个字符串..我在其他地方测试了它并且它已正常工作。

public String QRcodeReturn(){

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

    return QRcode;
}

1 个答案:

答案 0 :(得分:1)

QRcodeReturn()因为它现在只有正确的Context才能正常工作(它需要getSharedPreferences() metod工作)。它不适用于`ToolDB。

你应该:

  • Context参数传递给它
  • 或者在使用ToolDB类之前从您的活动中运行此方法,并将获得的值传递给ToolDB类。

例如:

public String QRcodeReturn(Context context){

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

    return QRcode;
}

然后您可以在活动中使用它:

String code = QRcodeReturn(this);

QuantReturn()

public String QuantReturn(Context context){

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