java - 如何根据id从数据库中获取信息
问题描述
我正在制作一个将杂货添加到列表中的应用程序,我有一个 Product 类,其中包含它的所有属性,所以我试图根据它的 Id 从数据库表中获取一个产品并返回它,但它一直告诉我每当我调用我的函数时,我的应用程序就会停止,这是我的代码
public Product GetProductById(String id)
{
SQLiteDatabase db=this.ourHelper.getReadableDatabase();
Product p=null;
Cursor cr;
cr = db.query(PRODUCTS_TABLE, null, PRODUCT_ID+"="+id, null, null, null, null);
cr.moveToFirst();
if(!cr.isAfterLast()) {
p=new Product();
p.setId(cr.getInt(0));
p.setName(cr.getString(1));
p.setQuantity(cr.getInt(2));
p.setPrice(cr.getDouble(3));
p.setAllergens(cr.getString(4));
p.setPurchased(cr.getInt(5));
p.setImage(cr.getBlob(6));
p.setPriority(cr.getInt(7));
}
return p;
}
此代码不起作用,我不知道错误在哪里。这是我的数据库列(名称和类型...):
public static final String DB_NAME="db_groceries";
public static final int DB_VER=1;
public static final String PRODUCT_NAME = "name";
public static final String PRODUCT_QUANTITY = "quantity";
public static final String PRODUCT_PRICE = "price";
public static final String PRODUCT_ALLERGENS = "allergens";
public static final String PRODUCT_PRIORITY = "priority";
public static final String PRODUCT_ID = "_id";
public static final String PRODUCT_IMAGE = "image";
public static final String PRODUCTS_TABLE = "groceries";
public static final String PRODUCTS_PURCHASED = "purchased";
public static final String SCRIPT_CREATE_PRODUCTS_TABLE = "create table "
+ PRODUCTS_TABLE + "(" + PRODUCT_ID +
" integer primary key autoincrement," +
PRODUCT_NAME + " text not null," +
PRODUCT_QUANTITY + " integer not null," +
PRODUCT_PRICE + " real not null," +
PRODUCT_ALLERGENS + " text not null, " +
PRODUCTS_PURCHASED + " integer not null, " +
PRODUCT_IMAGE + " blob," +
PRODUCT_PRIORITY + " integer not null)";
你能弄清楚我的错误在哪里吗?
解决方案
我相信您的问题是您在调用 GetProductById 方法之前没有实例化ourHelper 。
如果你没有,那么你会得到一个空指针异常,类似于:-
11-01 19:54:35.925 1420-1420/axtest.axtest E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{axtest.axtest/axtest.axtest.MainActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
at android.app.ActivityThread.access$600(ActivityThread.java:130)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at axtest.axtest.MainActivity.GetProductById(MainActivity.java:134)
at axtest.axtest.MainActivity.onCreate(MainActivity.java:35)
at android.app.Activity.performCreate(Activity.java:5008)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
at android.app.ActivityThread.access$600(ActivityThread.java:130)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
要解决此问题,您需要按照以下方式实例化 ourHelper
**`ourHelper = new DatabaseHelper(this);`**
请注意 Databasehelper 可能不同(您还没有说类名是什么),并且签名也可能不同(它将取决于 Database helper 中的代码,尽管签名通常如上所述)。
否则你的代码工作正常。但是,也可能是您更改了表的结构但没有删除数据库。要排除这种情况,请删除应用程序的数据并重新运行应用程序。
推荐阅读
- python - 合并列和行索引上的两个数据框
- rsync - rsync -aur 但 rclone?
- python - 运行时的文件会创建自身的副本并删除原始文件。(Python)
- php - 如何将multiCURL请求中的GET和POST合二为一?
- swift - 更新 ARKit 的 ARWorldMap 后出现动态库错误
- ruby-on-rails - 「rescue500 => SocketError : getaddrinfo: Name or service not known」无法解决
- javascript - 即使使用不同的电子邮件登录,登录仍会重定向到同一页面
- python - 使用 cron 作业进行烧瓶 API 调用调度
- reactjs - 在 React 打字稿上将功能从一个组件传递到另一个组件的正确方法
- git - 如何在将分支 A 合并到分支 B 时将标签合并到分支?