SQLiteDatabase.rawQuery(java.lang.String, java.lang.String[])' 在空对象引用上
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/30611534/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
SQLiteDatabase.rawQuery(java.lang.String, java.lang.String[])' on a null object reference
提问by Krishna V
When accessing the database a NullPointerException
is thrown.
访问数据库时NullPointerException
抛出a。
Here is the code that creates the db:
这是创建数据库的代码:
public class DatabaseHelper extends SQLiteOpenHelper {
public static final String KEY_CREATE_TABLE = "CREATE TABLE IF NOT EXISTS {0} ({1})";
public static final String KEY_DROP_TABLE = "DROP TABLE IF EXISTS {0}";
private Context context;
Activity C;
private static final int CURRENT_DB_VERSION = 1;
private static final String DB_NAME = "vrochat.db";
SQLiteDatabase Db1;
public DatabaseHelper(Context context) {
super(context, DB_NAME, null, CURRENT_DB_VERSION);
this.context = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
createUserTable(db);
createMessageTable(db);
createDialogTable(db);
// // //Raj
createTimelineTable(db);
createNewsFeedTable(db);
createProfileTable(db);
createProfilemediaListTable(db);
createFriendinfoTable(db);
//samson
createMultiImagePostTable(db);
//
this.Db1=db;
}
private void createMultiImagePostTable(SQLiteDatabase db) {
// TODO Auto-generated method stub
StringBuilder MultiImagePostTablefields = new StringBuilder();
MultiImagePostTablefields.append(MultiImagePostTable.Cols.ID)
.append(" INTEGER PRIMARY KEY, ")
.append(MultiImagePostTable.Cols.IMAGE).append(" TEXT, ")
.append(MultiImagePostTable.Cols.IMAGE_CREATED_AT).append(" TEXT, ")
.append(MultiImagePostTable.Cols.IMAGE_THUMB).append(" TEXT, ")
.append(MultiImagePostTable.Cols.POST_ID).append(" TEXT ");
createTable(db, MultiImagePostTable.TABLE_NAME,
MultiImagePostTablefields.toString());
}
private void createUserTable(SQLiteDatabase db) {
StringBuilder userTableFields = new StringBuilder();
userTableFields.append(UserTable.Cols.ID)
.append(" INTEGER PRIMARY KEY AUTOINCREMENT, ")
.append(UserTable.Cols.USER_ID).append(" INTEGER, ")
.append(UserTable.Cols.FULL_NAME).append(" TEXT, ")
.append(UserTable.Cols.EMAIL).append(" TEXT, ")
.append(UserTable.Cols.LOGIN).append(" TEXT, ")
.append(UserTable.Cols.PHONE)
.append(" TEXT, ")
.append(UserTable.Cols.WEB_SITE)
.append(" TEXT, ")
.append(UserTable.Cols.CUSTOM_DATA)
.append(" TEXT, ")
.append(UserTable.Cols.LAST_REQUEST_AT)
.append(" TEXT, ")
.append(UserTable.Cols.EXTERNAL_ID)
.append(" TEXT, ")
// .append(UserTable.Cols.FACEBOOK_ID).append(" INTEGER, ")
// .append(UserTable.Cols.TWITTER_ID).append(" INTEGER, ")
.append(UserTable.Cols.BLOB_ID).append(" INTEGER, ")
.append(UserTable.Cols.AVATAR_URL).append(" TEXT, ")
.append(UserTable.Cols.STATUS).append(" TEXT, ")
.append(UserTable.Cols.IS_ONLINE).append(" INTEGER");
createTable(db, UserTable.TABLE_NAME, userTableFields.toString());
}
private void createMessageTable(SQLiteDatabase db) {
StringBuilder messageTableFields = new StringBuilder();
messageTableFields.append(MessageTable.Cols.ID)
.append(" INTEGER PRIMARY KEY, ")
.append(MessageTable.Cols.MESSAGE_ID).append(" TEXT UNIQUE, ")
.append(MessageTable.Cols.DIALOG_ID).append(" TEXT, ")
.append(MessageTable.Cols.SENDER_ID).append(" INTEGER, ")
.append(MessageTable.Cols.BODY).append(" TEXT, ")
.append(MessageTable.Cols.TIME).append(" LONG, ")
.append(MessageTable.Cols.ATTACH_FILE_ID).append(" TEXT, ")
.append(MessageTable.Cols.ATTACH_TYPE).append(" TEXT, ")
.append(MessageTable.Cols.IS_READ).append(" INTEGER, ")
.append(MessageTable.Cols.IS_DELIVERED).append(" INTEGER, ")
.append(MessageTable.Cols.IS_SYNC).append(" INTEGER, ")
.append(MessageTable.Cols.FRIENDS_NOTIFICATION_TYPE)
.append(" INTEGER");
createTable(db, MessageTable.TABLE_NAME, messageTableFields.toString());
}
private void createDialogTable(SQLiteDatabase db) {
StringBuilder dialogTableFields = new StringBuilder();
dialogTableFields.append(DialogTable.Cols.ID)
.append(" INTEGER PRIMARY KEY AUTOINCREMENT, ")
.append(DialogTable.Cols.DIALOG_ID).append(" TEXT, ")
.append(DialogTable.Cols.ROOM_JID_ID).append(" TEXT, ")
.append(DialogTable.Cols.NAME).append(" TEXT, ")
.append(DialogTable.Cols.COUNT_UNREAD_MESSAGES)
.append(" INTEGER, ").append(DialogTable.Cols.LAST_MESSAGE)
.append(" TEXT, ")
.append(DialogTable.Cols.LAST_MESSAGE_USER_ID)
.append(" LONG, ").append(DialogTable.Cols.LAST_DATE_SENT)
.append(" LONG, ").append(DialogTable.Cols.OCCUPANTS_IDS)
.append(" TEXT, ").append(DialogTable.Cols.PHOTO_URL)
.append(" TEXT, ").append(DialogTable.Cols.VROId)
.append(" TEXT, ").append(DialogTable.Cols.TYPE)
.append(" INTEGER");
createTable(db, DialogTable.TABLE_NAME, dialogTableFields.toString());
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
dropTable(db, UserTable.TABLE_NAME);
dropTable(db, MessageTable.TABLE_NAME);
dropTable(db, DialogTable.TABLE_NAME);
onCreate(db);
}
public void dropTable(SQLiteDatabase db, String name) {
String query = MessageFormat
.format(DatabaseHelper.KEY_DROP_TABLE, name);
db.execSQL(query);
}
public void createTable(SQLiteDatabase db, String name, String fields) {
String query = MessageFormat.format(DatabaseHelper.KEY_CREATE_TABLE,
name, fields);
db.execSQL(query);
}
// ///////////////Raj
private void createProfilemediaListTable(SQLiteDatabase db) {
// TODO Auto-generated method stub
StringBuilder ProfileMediaListTablefields = new StringBuilder();
ProfileMediaListTablefields.append(ProfileMedialistTable.Cols.ID)
.append(" INTEGER PRIMARY KEY AUTOINCREMENT, ")
.append(ProfileMedialistTable.Cols.USERID).append(" INTEGER, ")
.append(ProfileMedialistTable.Cols.IMAGETHUMB)
.append(" TEXT, ").append(ProfileMedialistTable.Cols.IMAGEURL)
.append(" TEXT, ").append(ProfileMedialistTable.Cols.TYPE)
.append(" TEXT ");
createTable(db, ProfileMedialistTable.TABLE_NAME,
ProfileMediaListTablefields.toString());
}
private void createProfileTable(SQLiteDatabase db) {
// TODO Auto-generated method stub
StringBuilder ProfileTableFields = new StringBuilder();
ProfileTableFields.append(ProfileTable.Cols.ABOUT).append(" TEXT, ")
.append(ProfileTable.Cols.CHANNELCOUNT).append(" TEXT, ")
.append(ProfileTable.Cols.CITY).append(" TEXT, ")
.append(ProfileTable.Cols.COLLEGEAT).append(" TEXT, ")
.append(ProfileTable.Cols.COUNTRY)
.append(" TEXT, ")
.append(ProfileTable.Cols.DOB)
.append(" TEXT, ")
.append(ProfileTable.Cols.EMAIL)
.append(" TEXT, ")
.append(ProfileTable.Cols.FIRSTNAME)
.append(" TEXT, ")
.append(ProfileTable.Cols.FRIENDSCOUNT)
.append(" TEXT, ")
.append(ProfileTable.Cols.FRIENDSHIPSTATUS)
.append(" TEXT, ")
.append(ProfileTable.Cols.GENDER)
.append(" TEXT, ")
.append(ProfileTable.Cols.HOBBY)
.append(" TEXT, ")
.append(ProfileTable.Cols.IMAGECOUNT)
.append(" TEXT, ")
.append(ProfileTable.Cols.INTERESTS)
.append(" TEXT, ")
.append(ProfileTable.Cols.LASTNAME)
.append(" TEXT, ")
// .append(ProfileTable.Cols.MEDIALIST).append(" TEXT, ")
.append(ProfileTable.Cols.MEMBERSINCE).append(" TEXT, ")
.append(ProfileTable.Cols.PRIVACY).append(" TEXT, ")
.append(ProfileTable.Cols.PROFILEPICURL).append(" TEXT, ")
.append(ProfileTable.Cols.QBID).append(" TEXT, ")
.append(ProfileTable.Cols.RELATIONSHIPSTATUS).append(" TEXT, ")
.append(ProfileTable.Cols.SCHOOLAT).append(" TEXT, ")
.append(ProfileTable.Cols.STATE).append(" TEXT, ")
.append(ProfileTable.Cols.TIMELINEPIC).append(" TEXT, ")
.append(ProfileTable.Cols.USERID)
.append(" INTEGER PRIMARY KEY, ")
.append(ProfileTable.Cols.USERNAME).append(" TEXT, ")
.append(ProfileTable.Cols.VIDEOCOUNT).append(" TEXT, ")
.append(ProfileTable.Cols.WORKSAT).append(" TEXT ");
createTable(db, ProfileTable.TABLE_NAME, ProfileTableFields.toString());
}
private void createNewsFeedTable(SQLiteDatabase db) {
// TODO Auto-generated method stub
StringBuilder NewsFeedTableFields = new StringBuilder();
NewsFeedTableFields.append(TimelineTable.Cols.ID).append(" INTEGER, ")
.append(NewsFeedTable.Cols.VROID).append(" INTEGER, ")
.append(NewsFeedTable.Cols.FIRST_NAME).append(" TEXT, ")
.append(NewsFeedTable.Cols.LAST_NAME).append(" TEXT, ")
.append(NewsFeedTable.Cols.POST_TITLE).append(" TEXT, ")
.append(NewsFeedTable.Cols.POST_CONTENT).append(" TEXT, ")
.append(NewsFeedTable.Cols.POST_TYPE).append(" TEXT, ")
.append(NewsFeedTable.Cols.POST_IMAGEURL).append(" TEXT, ")
.append(NewsFeedTable.Cols.POST_IMAGEURL_THUMB)
.append(" TEXT, ").append(NewsFeedTable.Cols.POST_VIDEOURL)
.append(" TEXT, ").append(NewsFeedTable.Cols.POST_CREATED)
.append(" TEXT, ").append(NewsFeedTable.Cols.POST_UPDATED)
.append(" TEXT, ").append(NewsFeedTable.Cols.LIKE_COUNT)
.append(" INTEGER, ").append(NewsFeedTable.Cols.COMMENT_COUNT)
.append(" INTEGER, ").append(NewsFeedTable.Cols.SHARE_COUNT)
.append(" INTEGER, ").append(NewsFeedTable.Cols.IS_MY_POST)
.append(" TEXT, ").append(NewsFeedTable.Cols.IS_SHARED)
.append(" TEXT, ").append(NewsFeedTable.Cols.IS_LIKED)
.append(" TEXT, ")
.append(NewsFeedTable.Cols.FROM_USER_FIRSTNAME)
.append(" TEXT, ").append(NewsFeedTable.Cols.FROM_USER_ID)
.append(" TEXT, ")
.append(NewsFeedTable.Cols.FROM_USER_LAST_NAME)
.append(" TEXT, ")
.append(NewsFeedTable.Cols.FROM_USER_PROFILE_PIC)
.append(" TEXT, ")
.append(NewsFeedTable.Cols.TO_USER_FIRST_NAME)
.append(" TEXT, ").append(NewsFeedTable.Cols.TO_USER_LAST_NAME)
.append(" TEXT, ")
.append(NewsFeedTable.Cols.TO_USER_PROFILE_PIC)
.append(" TEXT, ").append(NewsFeedTable.Cols.USERS_POSTID)
.append(" INTEGER PRIMARY KEY, ")
.append(NewsFeedTable.Cols.YOUTUBE_VIDEO_URL).append(" TEXT, ")
.append(NewsFeedTable.Cols.POST__VIDEO_URL_THUMB)
.append(" TEXT");
createTable(db, NewsFeedTable.TABLE_NAME,
NewsFeedTableFields.toString());
}
private void createTimelineTable(SQLiteDatabase db) {
// TODO Auto-generated method stub
StringBuilder timeLineTableFields = new StringBuilder();
timeLineTableFields.append(TimelineTable.Cols.ID).append(" INTEGER, ")
.append(TimelineTable.Cols.VROID).append(" INTEGER, ")
.append(TimelineTable.Cols.FIRST_NAME).append(" TEXT, ")
.append(TimelineTable.Cols.LAST_NAME).append(" TEXT, ")
.append(TimelineTable.Cols.POST_TITLE).append(" TEXT, ")
.append(TimelineTable.Cols.POST_CONTENT).append(" TEXT, ")
.append(TimelineTable.Cols.POST_TYPE).append(" TEXT, ")
.append(TimelineTable.Cols.POST_IMAGEURL).append(" TEXT, ")
.append(TimelineTable.Cols.POST_IMAGEURL_THUMB)
.append(" TEXT, ").append(TimelineTable.Cols.POST_VIDEOURL)
.append(" TEXT, ").append(TimelineTable.Cols.POST_CREATED)
.append(" TEXT, ").append(TimelineTable.Cols.POST_UPDATED)
.append(" TEXT, ").append(TimelineTable.Cols.LIKE_COUNT)
.append(" INTEGER, ").append(TimelineTable.Cols.COMMENT_COUNT)
.append(" INTEGER, ").append(TimelineTable.Cols.SHARE_COUNT)
.append(" INTEGER, ").append(TimelineTable.Cols.IS_MY_POST)
.append(" TEXT, ").append(TimelineTable.Cols.IS_SHARED)
.append(" TEXT, ").append(TimelineTable.Cols.IS_LIKED)
.append(" TEXT, ")
.append(TimelineTable.Cols.FROM_USER_FIRSTNAME)
.append(" TEXT, ").append(TimelineTable.Cols.FROM_USER_ID)
.append(" TEXT, ")
.append(TimelineTable.Cols.FROM_USER_LAST_NAME)
.append(" TEXT, ")
.append(TimelineTable.Cols.FROM_USER_PROFILE_PIC)
.append(" TEXT, ")
.append(TimelineTable.Cols.TO_USER_FIRST_NAME)
.append(" TEXT, ").append(TimelineTable.Cols.TO_USER_LAST_NAME)
.append(" TEXT, ")
.append(TimelineTable.Cols.TO_USER_PROFILE_PIC)
.append(" TEXT, ").append(TimelineTable.Cols.USERS_POSTID)
.append(" INTEGER PRIMARY KEY, ")
.append(TimelineTable.Cols.YOUTUBE_VIDEO_URL).append(" TEXT, ")
.append(TimelineTable.Cols.POST__VIDEO_URL_THUMB)
.append(" TEXT");
createTable(db, TimelineTable.TABLE_NAME,
timeLineTableFields.toString());
}
private void createFriendinfoTable(SQLiteDatabase db) {
// TODO Auto-generated method stub
StringBuilder FriendInfoTablefields = new StringBuilder();
FriendInfoTablefields.append(FriendinfoTable.Cols.ID)
.append(" INTEGER PRIMARY KEY, ")
.append(FriendinfoTable.Cols.FIRST_NAME).append(" TEXT, ")
.append(FriendinfoTable.Cols.LAST_NAME).append(" TEXT, ")
.append(FriendinfoTable.Cols.USER_NAME).append(" TEXT, ")
.append(FriendinfoTable.Cols.EMAIL).append(" TEXT, ")
.append(FriendinfoTable.Cols.USER_PROFILE_PIC)
.append(" TEXT, ")
.append(FriendinfoTable.Cols.USER_TIMELINE_PIC)
.append(" TEXT, ").append(FriendinfoTable.Cols.COUNTRY)
.append(" TEXT, ").append(FriendinfoTable.Cols.STATE)
.append(" TEXT, ").append(FriendinfoTable.Cols.CITY)
.append(" TEXT, ").append(FriendinfoTable.Cols.ABOUT)
.append(" TEXT, ").append(FriendinfoTable.Cols.GENDER)
.append(" TEXT, ").append(FriendinfoTable.Cols.DATEOFBIRTH)
.append(" TEXT, ")
.append(FriendinfoTable.Cols.FRIENDSHIP_STATUS)
.append(" TEXT, ").append(FriendinfoTable.Cols.QUICKBLOX_ID)
.append(" TEXT ");
createTable(db, FriendinfoTable.TABLE_NAME,
FriendInfoTablefields.toString());
}
//aswathy
public void getfriendsdata()
{
Cursor c=Db1.rawQuery("SELECT * FROM friendinfotable",null);
try
{
//put cursor on the first position
c.moveToFirst();
//fetching all records from cursor until reaching last record
while(!c.isAfterLast())
{
/*
* Display record on the screen
* Note : here in the cursor there are two columns.
* So be careful while fetching record.
* If no column is there, it will give you exception
*/
Toast.makeText(context,c.getString(0)+ " "+c.getString(1),Toast.LENGTH_SHORT).show();
//moving cursor to next record
c.moveToNext();
}
//closing cursor
c.close();
}catch(Exception e)
{
Log.d("Error", "error in cursor");
e.printStackTrace();
}
}
This is how it is invoked:
这是它的调用方式:
public class FindPeopleFragment extends BaseFragment{
....
private void loadMoreData() {
DatabaseHelper dh=new DatabaseHelper(getActivity());
dh.getfriendsdata();
}
}
Here is the logcat output showing the exception:
这是显示异常的 logcat 输出:
java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.Cursor android.database.sqlite.SQLiteDatabase.rawQuery(java.lang.String, java.lang.String[])' on a null object reference at below line
Cursor c=Db1.rawQuery("SELECT * FROM friendinfotable",null);
回答by Jens
Looks like onCreate
is not called before you run getfriendsdata();
. Because Db1
is only initialized if in onCreate()
.
onCreate
运行之前貌似没有调用getfriendsdata();
。因为Db1
只有在 in 时才初始化onCreate()
。
You have to call Cursor c= getReadableDatabase().rawQuery("SELECT * FROM friendinfotable",null);
你必须打电话 Cursor c= getReadableDatabase().rawQuery("SELECT * FROM friendinfotable",null);
回答by Krishna V
onCreate() is called in
only once
at the time of database creation.
onCreate() 在
only once
数据库创建时被调用。
Cursor c=Db1.rawQuery("SELECT * FROM friendinfotable",null);
so your database Db1 instance will be null when the application opened for the second time onwards.
所以当应用程序第二次打开时,您的数据库 Db1 实例将为空。
so you need to getting the database reference use.
所以你需要获取数据库参考使用。
SQLiteDatabase Db1=getReadableDatabase();
and then call.
然后打电话。
Cursor c=Db1.rawQuery("SELECT * FROM friendinfotable",null);