What's wrong with accessing row in database from MainActivity?
I'm trying to access a row in my database from MainActivity in the following fashion. I'd like to know a better way to do this since this crashes my app with the error every time. Even after cold rebooting and wiping data.
"23:06 Emulator: glTexImage2D: got err pre :( 0x502 internal 0x1908 format 0x1908 type 0x1401
I assume there is a better way to do this. I'm calling a method which takes a User object which is stored in my database presumably at index 1. (first place in database)
if(myDb.isNotEmpty() == true) {
MyProgress.calculateBalance***(myDb.getUser(1));***
this is my getUser method.
public User getUser(int id) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_NAME, // a. table
COLUMNS, // b. column names
" id = ?", // c. selections
new String { String.valueOf(id) }, // d. selections args
null, // e. group by
null, // f. having
null, // g. order by
null); // h. limit
if (cursor != null)
cursor.moveToFirst();
User user = new User();
user.setId(Integer.parseInt(cursor.getString(0)));
user.setWeight (Integer.parseInt(cursor.getString(1)));
user.setAge(Integer.parseInt(cursor.getString(2)));
return user;
}
android sqlite
add a comment |
I'm trying to access a row in my database from MainActivity in the following fashion. I'd like to know a better way to do this since this crashes my app with the error every time. Even after cold rebooting and wiping data.
"23:06 Emulator: glTexImage2D: got err pre :( 0x502 internal 0x1908 format 0x1908 type 0x1401
I assume there is a better way to do this. I'm calling a method which takes a User object which is stored in my database presumably at index 1. (first place in database)
if(myDb.isNotEmpty() == true) {
MyProgress.calculateBalance***(myDb.getUser(1));***
this is my getUser method.
public User getUser(int id) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_NAME, // a. table
COLUMNS, // b. column names
" id = ?", // c. selections
new String { String.valueOf(id) }, // d. selections args
null, // e. group by
null, // f. having
null, // g. order by
null); // h. limit
if (cursor != null)
cursor.moveToFirst();
User user = new User();
user.setId(Integer.parseInt(cursor.getString(0)));
user.setWeight (Integer.parseInt(cursor.getString(1)));
user.setAge(Integer.parseInt(cursor.getString(2)));
return user;
}
android sqlite
this crashes my app
is not an error description; please add the relevant stack-trace... besides, callingdb.close()
is suggested (possibly even the reason for the crash).
– Martin Zeitler
Nov 15 '18 at 22:19
1
that error message is GL drivers related... and has nothing to do with the code. the relevant stack-trace should refer to theMainActivity
and have a bunch of lines; commonly displayed in red text.
– Martin Zeitler
Nov 15 '18 at 22:33
I really can't find other error messages than that. The problem is however solved. It works since I wrapped my getUser method(). Are you saying I should call db.close in MainActivity?
– Marko Marinkovic
Nov 15 '18 at 22:41
Please note thatquery()
always returns aCursor
or throws an error. So, wrap your code in atry..catch
block and forget aboutif(cursor != null)
. Also note that if you are returned a validCursor
object that this does not mean that you have any values. This means that you should be checking theboolean
value returned bycursor.moveToFirst()
before you proceed with trying to read the values.
– Barns
Nov 15 '18 at 22:44
add a comment |
I'm trying to access a row in my database from MainActivity in the following fashion. I'd like to know a better way to do this since this crashes my app with the error every time. Even after cold rebooting and wiping data.
"23:06 Emulator: glTexImage2D: got err pre :( 0x502 internal 0x1908 format 0x1908 type 0x1401
I assume there is a better way to do this. I'm calling a method which takes a User object which is stored in my database presumably at index 1. (first place in database)
if(myDb.isNotEmpty() == true) {
MyProgress.calculateBalance***(myDb.getUser(1));***
this is my getUser method.
public User getUser(int id) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_NAME, // a. table
COLUMNS, // b. column names
" id = ?", // c. selections
new String { String.valueOf(id) }, // d. selections args
null, // e. group by
null, // f. having
null, // g. order by
null); // h. limit
if (cursor != null)
cursor.moveToFirst();
User user = new User();
user.setId(Integer.parseInt(cursor.getString(0)));
user.setWeight (Integer.parseInt(cursor.getString(1)));
user.setAge(Integer.parseInt(cursor.getString(2)));
return user;
}
android sqlite
I'm trying to access a row in my database from MainActivity in the following fashion. I'd like to know a better way to do this since this crashes my app with the error every time. Even after cold rebooting and wiping data.
"23:06 Emulator: glTexImage2D: got err pre :( 0x502 internal 0x1908 format 0x1908 type 0x1401
I assume there is a better way to do this. I'm calling a method which takes a User object which is stored in my database presumably at index 1. (first place in database)
if(myDb.isNotEmpty() == true) {
MyProgress.calculateBalance***(myDb.getUser(1));***
this is my getUser method.
public User getUser(int id) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_NAME, // a. table
COLUMNS, // b. column names
" id = ?", // c. selections
new String { String.valueOf(id) }, // d. selections args
null, // e. group by
null, // f. having
null, // g. order by
null); // h. limit
if (cursor != null)
cursor.moveToFirst();
User user = new User();
user.setId(Integer.parseInt(cursor.getString(0)));
user.setWeight (Integer.parseInt(cursor.getString(1)));
user.setAge(Integer.parseInt(cursor.getString(2)));
return user;
}
android sqlite
android sqlite
edited Nov 15 '18 at 22:23
Marko Marinkovic
asked Nov 15 '18 at 21:34
Marko MarinkovicMarko Marinkovic
378
378
this crashes my app
is not an error description; please add the relevant stack-trace... besides, callingdb.close()
is suggested (possibly even the reason for the crash).
– Martin Zeitler
Nov 15 '18 at 22:19
1
that error message is GL drivers related... and has nothing to do with the code. the relevant stack-trace should refer to theMainActivity
and have a bunch of lines; commonly displayed in red text.
– Martin Zeitler
Nov 15 '18 at 22:33
I really can't find other error messages than that. The problem is however solved. It works since I wrapped my getUser method(). Are you saying I should call db.close in MainActivity?
– Marko Marinkovic
Nov 15 '18 at 22:41
Please note thatquery()
always returns aCursor
or throws an error. So, wrap your code in atry..catch
block and forget aboutif(cursor != null)
. Also note that if you are returned a validCursor
object that this does not mean that you have any values. This means that you should be checking theboolean
value returned bycursor.moveToFirst()
before you proceed with trying to read the values.
– Barns
Nov 15 '18 at 22:44
add a comment |
this crashes my app
is not an error description; please add the relevant stack-trace... besides, callingdb.close()
is suggested (possibly even the reason for the crash).
– Martin Zeitler
Nov 15 '18 at 22:19
1
that error message is GL drivers related... and has nothing to do with the code. the relevant stack-trace should refer to theMainActivity
and have a bunch of lines; commonly displayed in red text.
– Martin Zeitler
Nov 15 '18 at 22:33
I really can't find other error messages than that. The problem is however solved. It works since I wrapped my getUser method(). Are you saying I should call db.close in MainActivity?
– Marko Marinkovic
Nov 15 '18 at 22:41
Please note thatquery()
always returns aCursor
or throws an error. So, wrap your code in atry..catch
block and forget aboutif(cursor != null)
. Also note that if you are returned a validCursor
object that this does not mean that you have any values. This means that you should be checking theboolean
value returned bycursor.moveToFirst()
before you proceed with trying to read the values.
– Barns
Nov 15 '18 at 22:44
this crashes my app
is not an error description; please add the relevant stack-trace... besides, calling db.close()
is suggested (possibly even the reason for the crash).– Martin Zeitler
Nov 15 '18 at 22:19
this crashes my app
is not an error description; please add the relevant stack-trace... besides, calling db.close()
is suggested (possibly even the reason for the crash).– Martin Zeitler
Nov 15 '18 at 22:19
1
1
that error message is GL drivers related... and has nothing to do with the code. the relevant stack-trace should refer to the
MainActivity
and have a bunch of lines; commonly displayed in red text.– Martin Zeitler
Nov 15 '18 at 22:33
that error message is GL drivers related... and has nothing to do with the code. the relevant stack-trace should refer to the
MainActivity
and have a bunch of lines; commonly displayed in red text.– Martin Zeitler
Nov 15 '18 at 22:33
I really can't find other error messages than that. The problem is however solved. It works since I wrapped my getUser method(). Are you saying I should call db.close in MainActivity?
– Marko Marinkovic
Nov 15 '18 at 22:41
I really can't find other error messages than that. The problem is however solved. It works since I wrapped my getUser method(). Are you saying I should call db.close in MainActivity?
– Marko Marinkovic
Nov 15 '18 at 22:41
Please note that
query()
always returns a Cursor
or throws an error. So, wrap your code in a try..catch
block and forget about if(cursor != null)
. Also note that if you are returned a valid Cursor
object that this does not mean that you have any values. This means that you should be checking the boolean
value returned by cursor.moveToFirst()
before you proceed with trying to read the values.– Barns
Nov 15 '18 at 22:44
Please note that
query()
always returns a Cursor
or throws an error. So, wrap your code in a try..catch
block and forget about if(cursor != null)
. Also note that if you are returned a valid Cursor
object that this does not mean that you have any values. This means that you should be checking the boolean
value returned by cursor.moveToFirst()
before you proceed with trying to read the values.– Barns
Nov 15 '18 at 22:44
add a comment |
2 Answers
2
active
oldest
votes
The last part of your method should look like this:
if ((cursor != null) && (cursor.moveToFirst()) {
User user = new User();
user.setId(Integer.parseInt(cursor.getString(0)));
user.setWeight (Integer.parseInt(cursor.getString(1)));
user.setAge(Integer.parseInt(cursor.getString(2)));
return user;
} else {
return null;
}
This code ensures that the if the cursor returned is null
or does not contain at least 1 row, it will not throw an error.
In this case the method will return null
.
Of course if the cursor is prepared with no errors and myDB
is properly initialized there is no reason for the cursor to be null, so you must check for valid column, table and database names.
Also after every change you make to any of these always uninstall the app from the emulator/device so the database is deleted and rerun the app to recreate everything.
add a comment |
Better way would be use Save data in a local database using Room
Here is your code I see null check is done but it protect only one statement from NPE. You need to wrap user creation under this if condition.
@Nullable
public User getUser(int id) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_NAME, // a. table
COLUMNS, // b. column names
" id = ?", // c. selections
new String { String.valueOf(id) }, // d. selections args
null, // e. group by
null, // f. having
null, // g. order by
null); // h. limit
if (cursor != null && cursor.moveToFirst()) {
User user = new User();
user.setId(Integer.parseInt(cursor.getString(0)));
user.setWeight (Integer.parseInt(cursor.getString(1)));
user.setAge(Integer.parseInt(cursor.getString(2)));
return user;
}
return null;
}
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53328227%2fwhats-wrong-with-accessing-row-in-database-from-mainactivity%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
The last part of your method should look like this:
if ((cursor != null) && (cursor.moveToFirst()) {
User user = new User();
user.setId(Integer.parseInt(cursor.getString(0)));
user.setWeight (Integer.parseInt(cursor.getString(1)));
user.setAge(Integer.parseInt(cursor.getString(2)));
return user;
} else {
return null;
}
This code ensures that the if the cursor returned is null
or does not contain at least 1 row, it will not throw an error.
In this case the method will return null
.
Of course if the cursor is prepared with no errors and myDB
is properly initialized there is no reason for the cursor to be null, so you must check for valid column, table and database names.
Also after every change you make to any of these always uninstall the app from the emulator/device so the database is deleted and rerun the app to recreate everything.
add a comment |
The last part of your method should look like this:
if ((cursor != null) && (cursor.moveToFirst()) {
User user = new User();
user.setId(Integer.parseInt(cursor.getString(0)));
user.setWeight (Integer.parseInt(cursor.getString(1)));
user.setAge(Integer.parseInt(cursor.getString(2)));
return user;
} else {
return null;
}
This code ensures that the if the cursor returned is null
or does not contain at least 1 row, it will not throw an error.
In this case the method will return null
.
Of course if the cursor is prepared with no errors and myDB
is properly initialized there is no reason for the cursor to be null, so you must check for valid column, table and database names.
Also after every change you make to any of these always uninstall the app from the emulator/device so the database is deleted and rerun the app to recreate everything.
add a comment |
The last part of your method should look like this:
if ((cursor != null) && (cursor.moveToFirst()) {
User user = new User();
user.setId(Integer.parseInt(cursor.getString(0)));
user.setWeight (Integer.parseInt(cursor.getString(1)));
user.setAge(Integer.parseInt(cursor.getString(2)));
return user;
} else {
return null;
}
This code ensures that the if the cursor returned is null
or does not contain at least 1 row, it will not throw an error.
In this case the method will return null
.
Of course if the cursor is prepared with no errors and myDB
is properly initialized there is no reason for the cursor to be null, so you must check for valid column, table and database names.
Also after every change you make to any of these always uninstall the app from the emulator/device so the database is deleted and rerun the app to recreate everything.
The last part of your method should look like this:
if ((cursor != null) && (cursor.moveToFirst()) {
User user = new User();
user.setId(Integer.parseInt(cursor.getString(0)));
user.setWeight (Integer.parseInt(cursor.getString(1)));
user.setAge(Integer.parseInt(cursor.getString(2)));
return user;
} else {
return null;
}
This code ensures that the if the cursor returned is null
or does not contain at least 1 row, it will not throw an error.
In this case the method will return null
.
Of course if the cursor is prepared with no errors and myDB
is properly initialized there is no reason for the cursor to be null, so you must check for valid column, table and database names.
Also after every change you make to any of these always uninstall the app from the emulator/device so the database is deleted and rerun the app to recreate everything.
edited Nov 15 '18 at 21:58
answered Nov 15 '18 at 21:48
forpasforpas
17.8k3728
17.8k3728
add a comment |
add a comment |
Better way would be use Save data in a local database using Room
Here is your code I see null check is done but it protect only one statement from NPE. You need to wrap user creation under this if condition.
@Nullable
public User getUser(int id) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_NAME, // a. table
COLUMNS, // b. column names
" id = ?", // c. selections
new String { String.valueOf(id) }, // d. selections args
null, // e. group by
null, // f. having
null, // g. order by
null); // h. limit
if (cursor != null && cursor.moveToFirst()) {
User user = new User();
user.setId(Integer.parseInt(cursor.getString(0)));
user.setWeight (Integer.parseInt(cursor.getString(1)));
user.setAge(Integer.parseInt(cursor.getString(2)));
return user;
}
return null;
}
add a comment |
Better way would be use Save data in a local database using Room
Here is your code I see null check is done but it protect only one statement from NPE. You need to wrap user creation under this if condition.
@Nullable
public User getUser(int id) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_NAME, // a. table
COLUMNS, // b. column names
" id = ?", // c. selections
new String { String.valueOf(id) }, // d. selections args
null, // e. group by
null, // f. having
null, // g. order by
null); // h. limit
if (cursor != null && cursor.moveToFirst()) {
User user = new User();
user.setId(Integer.parseInt(cursor.getString(0)));
user.setWeight (Integer.parseInt(cursor.getString(1)));
user.setAge(Integer.parseInt(cursor.getString(2)));
return user;
}
return null;
}
add a comment |
Better way would be use Save data in a local database using Room
Here is your code I see null check is done but it protect only one statement from NPE. You need to wrap user creation under this if condition.
@Nullable
public User getUser(int id) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_NAME, // a. table
COLUMNS, // b. column names
" id = ?", // c. selections
new String { String.valueOf(id) }, // d. selections args
null, // e. group by
null, // f. having
null, // g. order by
null); // h. limit
if (cursor != null && cursor.moveToFirst()) {
User user = new User();
user.setId(Integer.parseInt(cursor.getString(0)));
user.setWeight (Integer.parseInt(cursor.getString(1)));
user.setAge(Integer.parseInt(cursor.getString(2)));
return user;
}
return null;
}
Better way would be use Save data in a local database using Room
Here is your code I see null check is done but it protect only one statement from NPE. You need to wrap user creation under this if condition.
@Nullable
public User getUser(int id) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_NAME, // a. table
COLUMNS, // b. column names
" id = ?", // c. selections
new String { String.valueOf(id) }, // d. selections args
null, // e. group by
null, // f. having
null, // g. order by
null); // h. limit
if (cursor != null && cursor.moveToFirst()) {
User user = new User();
user.setId(Integer.parseInt(cursor.getString(0)));
user.setWeight (Integer.parseInt(cursor.getString(1)));
user.setAge(Integer.parseInt(cursor.getString(2)));
return user;
}
return null;
}
edited Nov 15 '18 at 23:40
answered Nov 15 '18 at 22:11
PrakashPrakash
2,9482130
2,9482130
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53328227%2fwhats-wrong-with-accessing-row-in-database-from-mainactivity%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
this crashes my app
is not an error description; please add the relevant stack-trace... besides, callingdb.close()
is suggested (possibly even the reason for the crash).– Martin Zeitler
Nov 15 '18 at 22:19
1
that error message is GL drivers related... and has nothing to do with the code. the relevant stack-trace should refer to the
MainActivity
and have a bunch of lines; commonly displayed in red text.– Martin Zeitler
Nov 15 '18 at 22:33
I really can't find other error messages than that. The problem is however solved. It works since I wrapped my getUser method(). Are you saying I should call db.close in MainActivity?
– Marko Marinkovic
Nov 15 '18 at 22:41
Please note that
query()
always returns aCursor
or throws an error. So, wrap your code in atry..catch
block and forget aboutif(cursor != null)
. Also note that if you are returned a validCursor
object that this does not mean that you have any values. This means that you should be checking theboolean
value returned bycursor.moveToFirst()
before you proceed with trying to read the values.– Barns
Nov 15 '18 at 22:44