从数据库中检索单个ROW

时间:2018-01-12 22:55:32

标签: java android listview

我有一个listview,当用户点击listview中的某个项目时,它会调用一个函数getRow,该函数获取所点击项目的ID并检索名称点击的项目。

但是,当我单击该项时,我能够检索ID,但它不想运行查询来检索其余信息。

这是我的代码,以及logcat:

UserDbHelper.java(class)

public class UserDbHelper extends SQLiteOpenHelper {

    SQLiteDatabase db;
    UserDbHelper userDb;
    private static final String DATABASE_NAME = "USERINFO.db";
    private static final int DATABASE_VERSION = 1;
    private static final String CREATE_QUERY =

            "CREATE TABLE "+ UserContract.NewUserInfo.TABLE_NAME+"("+ UserContract.NewUserInfo.USER_ROWID+" integer primary key autoincrement, "+ UserContract.NewUserInfo.USER_NAME+" TEXT,"+
                    UserContract.NewUserInfo.USER_MOBILE+" TEXT,"+ UserContract.NewUserInfo.USER_EMAIL+" TEXT);";

    public static final String[] ALL_KEYS = new String[] {UserContract.NewUserInfo.USER_ROWID, UserContract.NewUserInfo.USER_NAME, UserContract.NewUserInfo.USER_MOBILE, UserContract.NewUserInfo.USER_EMAIL};

    public UserDbHelper(Context context){
        super(context,DATABASE_NAME,null,DATABASE_VERSION);
        Log.d("DATABASE OPERATIONS", "DATABASE CREATED/ OPENED...");

    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL(CREATE_QUERY);
        Log.d("DATABASE OPERATIONS", "TABLE CREATED...");


    }

    public void addInformations(String name, String mob, String email, SQLiteDatabase sqLiteDatabase){
        ContentValues contentValues = new ContentValues();
        contentValues.put(UserContract.NewUserInfo.USER_NAME,name);
        contentValues.put(UserContract.NewUserInfo.USER_MOBILE,mob);
        contentValues.put(UserContract.NewUserInfo.USER_EMAIL,email);

        sqLiteDatabase.insert(UserContract.NewUserInfo.TABLE_NAME,null,contentValues);
        Log.d("DATABASE OPERATIONS", "ONE ROW INSERTED....");
    }

    public Cursor getInformations(SQLiteDatabase sqLiteDatabase){
        Cursor cursor;

        String[] projections = {UserContract.NewUserInfo.USER_NAME, UserContract.NewUserInfo.USER_MOBILE, UserContract.NewUserInfo.USER_EMAIL};
        cursor = sqLiteDatabase.query(UserContract.NewUserInfo.TABLE_NAME, projections,null,null,null,null,null);

        return cursor;
    }

    // Get a specific row (by rowId)
    public Cursor getRow(long rowId) {
        String where = UserContract.NewUserInfo.USER_ROWID +"="+ rowId;
        Log.e("ID= ",where);

        String select = "SELECT "+ UserContract.NewUserInfo.USER_NAME+" FROM "+ UserContract.NewUserInfo.TABLE_NAME+ " WHERE "+where;
        Log.e("query = ", select);
        db.execSQL(select);

        return null;
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }
}

ListView.java(处理点击事件的活动)

    public class ListActivity extends AppCompatActivity {

        ListView listView;
        SQLiteDatabase sqLiteDatabase;;
        UserDbHelper user;
        Cursor cursor;
        ListDataAdapter listDataAdapter;


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

            listView = (ListView)  findViewById(R.id.list_view);
            listDataAdapter = new ListDataAdapter(getApplicationContext(),R.layout.row_layout);
            listView.setAdapter(listDataAdapter);

            user = new UserDbHelper(getApplicationContext());
            sqLiteDatabase = user.getReadableDatabase();

            cursor = user.getInformations(sqLiteDatabase);

            if(cursor.moveToFirst()){
                do{
                    String name, mob, email;
                    name = cursor.getString(0);
                    mob = cursor.getString(1);
                    email = cursor.getString(2);

                    DataProvider dataProvider = new DataProvider(name,mob,email);

                    listDataAdapter.add(dataProvider);
                }while(cursor.moveToNext());
            }

            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int i, long ldatabase) {
                    Cursor cursor = user.getRow(i);
                    if(cursor.moveToFirst()){
                        long idDb = cursor.getLong(0);
                        String message = "ID is: " +idDb;
                        Toast.makeText(ListActivity.this, message, Toast.LENGTH_SHORT).show();
                    }
                }
            });
        }
}

OnItemClickListener获取被点击项的id,将该值传递给UserDbHelper类,函数getRow,函数获取id,并运行查询,但是当它想要运行查询时,它会崩溃我的应用程序。

我还在logcat中打印了ID,以检查我是否收到了ID,我是。

这是LOGCAT:

01-12 17:40:47.574 13309-13309/bluwyreinc.rohansfitness E/ID=: _id=6
01-12 17:40:47.574 13309-13309/bluwyreinc.rohansfitness E/query =: SELECT user_name FROM user_info WHERE _id=6
01-12 17:40:47.575 13309-13309/bluwyreinc.rohansfitness E/AndroidRuntime: FATAL EXCEPTION: main
                                                                          Process: bluwyreinc.rohansfitness, PID: 13309
                                                                          java.lang.NullPointerException: Attempt to invoke virtual method 'void android.database.sqlite.SQLiteDatabase.execSQL(java.lang.String)' on a null object reference
                                                                              at bluwyreinc.rohansfitness.UserDbHelper.getRow(UserDbHelper.java:68)
                                                                              at bluwyreinc.rohansfitness.ListActivity$1.onItemClick(ListActivity.java:54)
                                                                              at android.widget.AdapterView.performItemClick(AdapterView.java:343)
                                                                              at android.widget.AbsListView.performItemClick(AbsListView.java:1665)
                                                                              at android.widget.AbsListView$PerformClick.run(AbsListView.java:4075)
                                                                              at android.widget.AbsListView$10.run(AbsListView.java:6552)
                                                                              at android.os.Handler.handleCallback(Handler.java:751)
                                                                              at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                              at android.os.Looper.loop(Looper.java:154)
                                                                              at android.app.ActivityThread.main(ActivityThread.java:6823)
                                                                              at java.lang.reflect.Method.invoke(Native Method)
                                                                              at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1563)
                                                                              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1451)
01-12 17:40:48.090 3104-3160/? E/ActivityTrigger: activityResumeTrigger: not whiteListedbluwyreinc.rohansfitness/bluwyreinc.rohansfitness.MainActivity/1

2 个答案:

答案 0 :(得分:1)

问题在于你的方法:

public Cursor getRow(long rowId) {
        String where = UserContract.NewUserInfo.USER_ROWID +"="+ rowId;
        Log.e("ID= ",where);

        String select = "SELECT "+ UserContract.NewUserInfo.USER_NAME+" FROM "+ UserContract.NewUserInfo.TABLE_NAME+ " WHERE "+where;
        Log.e("query = ", select);

        // Here db is null.
        db.execSQL(select);

        return null;
    }

传递它sqLiteDatabase它应该返回光标,如下所示:

public Cursor getRow(SQLiteDatabase sqLiteDatabase, long rowId) {
        String where = UserContract.NewUserInfo.USER_ROWID +"="+ rowId;
        Log.e("ID= ",where);

        String select = "SELECT "+ UserContract.NewUserInfo.USER_NAME+" FROM "+ UserContract.NewUserInfo.TABLE_NAME+ " WHERE "+where;
        Log.e("query = ", select);
        cursor = sqLiteDatabase.query(select);

        return cursor;
    }

答案 1 :(得分:0)

您永远不会将任何值设置为extension WKWebView{ private func stageWebViewForScreenshot() { let _scrollView = self.scrollView let pageSize = _scrollView.contentSize; let currentOffset = _scrollView.contentOffset let horizontalLimit = CGFloat(ceil(pageSize.width/_scrollView.frame.size.width)) let verticalLimit = CGFloat(ceil(pageSize.height/_scrollView.frame.size.height)) for i in stride(from: 0, to: verticalLimit, by: 1.0) { for j in stride(from: 0, to: horizontalLimit, by: 1.0) { _scrollView.scrollRectToVisible(CGRect(x: _scrollView.frame.size.width * j, y: _scrollView.frame.size.height * i, width: _scrollView.frame.size.width, height: _scrollView.frame.size.height), animated: true) RunLoop.main.run(until: Date.init(timeIntervalSinceNow: 1.0)) } } _scrollView.setContentOffset(currentOffset, animated: false) } func fullLengthScreenshot(_ completionBlock: ((UIImage) -> Void)?) { // First stage the web view so that all resources are downloaded. stageWebViewForScreenshot() let _scrollView = self.scrollView // Save the current bounds let tmp = self.bounds let tmpFrame = self.frame let currentOffset = _scrollView.contentOffset // Leave main thread alone for some time to let WKWebview render its contents / run its JS to load stuffs. mainDispatchAfter(2.0) { // Re evaluate the size of the webview let pageSize = _scrollView.contentSize UIGraphicsBeginImageContext(pageSize) self.bounds = CGRect(x: self.bounds.origin.x, y: self.bounds.origin.y, width: pageSize.width, height: pageSize.height) self.frame = CGRect(x: self.frame.origin.x, y: self.frame.origin.y, width: pageSize.width, height: pageSize.height) // Wait few seconds until the resources are loaded RunLoop.main.run(until: Date.init(timeIntervalSinceNow: 0.5)) self.layer.render(in: UIGraphicsGetCurrentContext()!) let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()! UIGraphicsEndImageContext() // reset Frame of view to origin self.bounds = tmp self.frame = tmpFrame _scrollView.setContentOffset(currentOffset, animated: false) completionBlock?(image) } } } 字段,因此当您尝试使用它时,它会为空并导致崩溃。在使用db之前,应确保db不为null

相关问题