我有一个listview
,当用户点击listview
中的某个项目时,它会调用一个函数getRow
,该函数获取所点击项目的ID并检索名称点击的项目。
但是,当我单击该项时,我能够检索ID,但它不想运行查询来检索其余信息。
这是我的代码,以及logcat:
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) {
}
}
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,我是。
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
答案 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