从 SQLite 数据库 Android 中检索值

Posted

技术标签:

【中文标题】从 SQLite 数据库 Android 中检索值【英文标题】:Retrieving Values from SQLite Database Android 【发布时间】:2018-04-18 15:42:22 【问题描述】:

感谢到目前为止的所有帮助。我已经成功创建了我的数据库并使用sqlite 浏览器查看了它。我想分别检索每列中的值。这是我在DBHelper 类中的代码:

public TingTingUser getCurrentUser(int id)
    SQLiteDatabase currDB = databaseManager.getWritableDatabase();
    Cursor cursor = currDB.query(true, TABLE_NAME, new String[]COL_ID, COL_USER_ID, COL_FULL_NAME, COL_GENDER, COL_DOB, COL_MOBILE_NUM, COL_OCCUPATION, COL_ORGANIZATION, COL_ID + "=?", new String[]String.valueOf(id), null, null, null, null);

    if (cursor != null && cursor.moveToFirst())
        TingTingUser user = new TingTingUser(Integer.parseInt(cursor.getString(0)), cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), cursor.getString(5), cursor.getString(6), cursor.getString(7));
        return user;
    

    return null;


在 log-cat 中,这些值是正确的,但在我的活动 class 中,它会引发异常。这是我检索单个值的代码:

我的DatabaseUtils班级:

public class DatabaseUtils extends AppCompatActivity 

private static final String TAG = DatabaseUtils.class.getSimpleName();

protected static DBHelper helper;
public static Context context;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);

    helper = new DBHelper(this);
    context = this;



public static String getUserPhoneNumber()
    TingTingUser user = helper.getCurrentUser(1);
    String number = user.getMobileNumber();

    Log.d(TAG, "Phone Number from DB is:\t" + number);

    if (number == null)
        return null;
    
    return number;


public static String getUserNameFromDB()
    TingTingUser user = helper.getCurrentUser(1);
    String name = user.getDisplayName();

    if (name == null)
        return null;
    
    return name;



public static boolean saveGalleryImageToDB(Uri uri)
    helper.open();

    InputStream inputStream = null;
    try 
        inputStream = context.getContentResolver().openInputStream(uri);
        byte[] inputData = AppUtils.ImageUtils.getBytes(inputStream);
        helper.saveGalleryImage(inputData);
        helper.close();
        return true;
     catch (FileNotFoundException e) 
        e.printStackTrace();
     catch (IOException e) 
        e.printStackTrace();
    
    finally 
        helper.close();
    
    return false;



public static boolean loadImage(Context context, ImageView imageView)
    try
        helper.open();
        byte[] bytes = helper.getImage();
        helper.close();
        Bitmap bitmap = AppUtils.ImageUtils.getImage(bytes);
        Uri uri = AppUtils.ImageUtils.getImageUri(context, bitmap);
        imageView.setImageBitmap(AppUtils.ImageUtils.getImage(bytes));
        return true;
     catch (Exception ex)
        ex.printStackTrace();
    
    return false;



在活动示例代码中检索电话号码:

String phone = DatabaseUtils.getUserPhoneNumber();
Log.d(TAG, "Phone Number form DB is:\t" + phone);

TingTingUser 是我的用户模型类,基本信息在DatabaseUtils 类中演示。

logcat 中的异常消息:

原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'com.billionusers.tingting.model.TingTingUser com.billionusers.tingting.db.DBHelper.getCurrentUser(int)' 在 com.billionusers.tingting.db.DatabaseUtils.getUserPhoneNumber(DatabaseUtils.java:39) 在 com.billionusers.tingting.activities.EditProfileActivity.onCreate(EditProfileActivity.java:89) 在 android.app.Activity.performCreate(Activity.java:5990) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 在 android.app.ActivityThread.access$800(ActivityThread.java:151) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5254) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

如何解决这个错误伙计们? 谢谢。

这是我的桌子的快照:

我想单独获取列值。请看一下并指导我。再次感谢大家。

【问题讨论】:

你在哪里打电话 String phone = DatabaseUtils.getUserPhoneNumber(); 在我希望使用 db 值的活动中,抱歉课程太长,会占用空间 你是从另一个活动中调用它吗? 这里有很多问题 - 将您的 DatabaseHelper 类变成单例。这里有一个很好的教程 - androiddesignpatterns.com/2012/05/… - 并直接访问它,而不是通过 Activity 上的静态方法。您的特定错误是由于您尝试通过 Activity 类上的静态方法访问数据库而导致的,而 Activity 本身尚未创建。另外,请不要将 static 引用存储到 Activity - 没有理由,这是内存泄漏的主要原因。 @AbdulWaheed,是的,在用户个人资料活动中填充视图 【参考方案1】:

这是因为您没有初始化 dbHelper。您在活动 onCreate 方法中对其进行初始化,这意味着如果您从其他活动中调用该静态方法,您将能够由于静态而访问该方法。正如您所建议的,您是从 profileactity 调用的,这意味着 onCreate 不是。由于这个 dbHelper 没有被初始化。要克服这个问题,您应该在该方法中初始化 dbhelper (getUserPhoneNumber()) 希望对你有帮助

【讨论】:

我已经在 getUserPhoneNumber() 方法中进行了初始化,但它引发了另一个异常。我将编辑该问题,以便您查看我的表格并告诉我如何单独撤销这些值。谢谢【参考方案2】:

检查数据库对象的初始化。

空指针异常是数据库对象未正确初始化时特别引起的。

【讨论】:

以上是关于从 SQLite 数据库 Android 中检索值的主要内容,如果未能解决你的问题,请参考以下文章

如何从表1中检索列数据并使用SQLite数据库将该列值插入到Android Studio的表2中?

如何从android中的sqlite中检索数据

如何从数据库中检索所有表? (Android,SQLite)[重复]

从 Android sqlite 数据库中检索大 blob

从 SQLite 数据库加载的数据未保存在模型类 ArrayList android 中

从 SQLite 表 iOS 中检索值