Android: оператор Select, возвращающий значение null в базе данных

#android #database

#Android #База данных

Вопрос:

Я получаю ответ со стороны сервера в виде массива json.Мне нужно сначала проанализировать их, а затем вставить эти значения в базу данных.Я проанализировал эти данные. Теперь мне нужно вставить эти данные в базу данных. Я использую следующий класс для создания сортировочных данных в базе данных.:

Ниже приведен мой вспомогательный класс:

 public class WineDatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "applicationdata";
    private static String DB_PATH = "/data/data/com.emxWinwcountry./databases/";
    private static final int DATABASE_VERSION = 1;

    public static final String DATABASE_CREATE ="CREATE TABLE resources(KEY_TYPE text  , KEY_ENCODING text , KEY_WIDTH text, KEY_HEIGHT text, KEY_DATA text ,KeyIId text)";
    public static final String DATABASE_NAVIGATION_CREATE = "create table navigation (KEY text,TYPE1 text ,LINK_NAME text,DISPLAY_NAME text ,FORWARD_ICON text ,HIGHLIGHTED_ICON_WITH_TEXT text,BANNER_IMAGE text,CHILDREN text,ICON_WITHOUT_TEXT text, HIGHLIGHTED_ICON_WITHOUT_TEXT text,ICON_WITH_TEXT text)";



    public WineDatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }



    // Method is called during creation of the database



    @Override
    public void onCreate(SQLiteDatabase database) {
        try{
            database.execSQL(DATABASE_CREATE);
        database.execSQL(DATABASE_NAVIGATION_CREATE);

    }
    catch (Exception e) {
        System.out.println("in on creste db" e);
    }}

    // Method is called during an upgrade of the database, e.g. if you increase
    // the database version
    @Override
    public void onUpgrade(SQLiteDatabase database, int oldVersion,
            int newVersion) {
        Log.w(WineDatabaseHelper.class.getName(),
                "Upgrading database from version "   oldVersion   " to "
                          newVersion   ", which will destroy all old data");
        database.execSQL("DROP TABLE IF EXISTS todo");
        onCreate(database);
    }
}
  

и ниже приведен мой класс адаптера

        public class WineDatabaseAdapter {

    // Database fields
    public static final String KEY_TYPE = "type";
    public static final String KEY_ID = "_id";
    public static final String KEY_WIDTH = "width";
    public static final String KEY_HEIGHT = "height";
    public static final String KEY_ENCODING = "encoding";
    public static final String KEY_DATA = "data";
    private static final String KeyIId = "iid";
    private static  String DATABASE_TABLE = "resources";
    private static  String DATABASE_TABLE_NAVIGATION = "navigation";
    private Context context;
    private SQLiteDatabase database;
    private WineDatabaseHelper dbHelper;

    public static final String DISPLAY_NAME= "display_name";
    public static final String KEY="key";
    public static final String TYPE1 = "type1";
    public static final String LINK_NAME = "link_name";
    private static final String FORWARD_ICON = "forward_icon";
    private static final String HIGHLIGHTED_ICON_WITH_TEXT = "highlighted_icon_with_text";
    private static final String ICON_WITHOUT_TEXT = "icon_without_text";
    private static final String HIGHLIGHTED_ICON_WITHOUT_TEXT = "highlighted_icon_without_text";
    private static final String Banner_Image = "banner_image";
    private static final String CHILDREN= "children";
    private static final String ICON_WITH_TEXT = "icon_with_text";
      private SQLiteDatabase db;
      private SQLiteStatement insertStmt;


       private static final String INSERT = "insert into " 
           DATABASE_TABLE   "(KEY_TYPE,KEY_ENCODING,KEY_WIDTH,KEY_HEIGHT,KEY_DATA,KeyIId)" " values (?,?,?,?,?,?)";


       private static final String INSERT_NAVIGATION = "insert into " 
               DATABASE_TABLE_NAVIGATION   "(KEY,TYPE1,LINK_NAME,DISPLAY_NAME,FORWARD_ICON,HIGHLIGHTED_ICON_WITH_TEXT,ICON_WITHOUT_TEXT,HIGHLIGHTED_ICON_WITHOUT_TEXT,Banner_Image,CHILDREN,ICON_WITH_TEXT)" " values (?,?,?,?,?,?,?,?,?,?,?)";


       public WineDatabaseAdapter(Context context) {
         try{
           this.context = context;
       WineDatabaseHelper openHelper = new WineDatabaseHelper(context);
       this.db=openHelper.getWritableDatabase();
      this.insertStmt=this.db.compileStatement(INSERT);
      this.insertStmt=this.db.compileStatement(INSERT_NAVIGATION);
       }
       catch(Exception e)
       {
           System.out.println(e);
       }
       }

       public long insert(String KEY_TYPE ,String KEY_ENCODING,String KEY_WIDTH,String KEY_HEIGHT,String KEY_DATA,String KeyIId){
           this.insertStmt.bindString(1, KEY_TYPE);
           this.insertStmt.bindString(2, KEY_ENCODING);
           this.insertStmt.bindString(3, KEY_WIDTH);
           this.insertStmt.bindString(4, KEY_WIDTH);
           this.insertStmt.bindString(5, KEY_DATA);
           this.insertStmt.bindString(6, KeyIId);
           return this.insertStmt.executeInsert();
       }

       public long insertNavigation(String KEY ,String TYPE1,String LINK_NAME,String DISPLAY_NAME,String FORWARD_ICON,String HIGHLIGHTED_ICON_WITH_TEXT,String ICON_WITHOUT_TEXT,String HIGHLIGHTED_ICON_WITHOUT_TEXT,String Banner_Image,String CHILDREN,String ICON_WITH_TEXT ){
           this.insertStmt.bindString(1, KEY);
           this.insertStmt.bindString(2, TYPE1);
           this.insertStmt.bindString(3, LINK_NAME);
           this.insertStmt.bindString(4, DISPLAY_NAME);
           this.insertStmt.bindString(5, FORWARD_ICON);
           this.insertStmt.bindString(6, HIGHLIGHTED_ICON_WITH_TEXT);
           this.insertStmt.bindString(7, ICON_WITHOUT_TEXT);
           this.insertStmt.bindString(8, HIGHLIGHTED_ICON_WITHOUT_TEXT);
           this.insertStmt.bindString(9, Banner_Image);
           this.insertStmt.bindString(10, CHILDREN);
           this.insertStmt.bindString(11, ICON_WITH_TEXT);

           return this.insertStmt.executeInsert();
       }

       public Cursor fetchAllResources() {
            return database.query(DATABASE_TABLE, new String[] { KEY_TYPE,
                    KEY_ENCODING, KEY_WIDTH, KEY_WIDTH,KEY_DATA, KeyIId}, null, null, null,
                    null, null);
        }

       public List<String> selectTable(){
           List<String> list=new ArrayList<String>();
       Cursor c = db.rawQuery("SELECT * FROM "  
               DATABASE_TABLE , null);
       if(c.moveToFirst()){
           do{
               list.add(c.getString(0));
           }
           while(c.moveToNext());
       }
       if(c !=null amp;amp; !c.isClosed()){
           c.close();
       }
       return list;
       }
       public void deleteAll(){
           this.db.delete(DATABASE_TABLE, null, null);
       }


       public void deleteAllNavigation(){
           this.db.delete(DATABASE_TABLE_NAVIGATION, null, null);
       }

       public List<String> selectAll(){
           List<String> list=new ArrayList<String>();
           Cursor cursor=this.db.query(DATABASE_TABLE, new String[]{"KEY_TYPE","KEY_ENCODING","KEY_WIDTH","KEY_HEIGHT","KEY_DATA","KeyIId"},
                   null, null, null, null, "KeyIId");

           if(cursor.moveToFirst()){
               do{
                   list.add(cursor.getString(0));
               }
               while(cursor.moveToNext());
           }
           if(cursor !=null amp;amp; !cursor.isClosed()){
               cursor.close();
           }
           return list;
       }


       public List<String> selectAllNavigation(){
           List<String> list=new ArrayList<String>();
           Cursor cursor=this.db.query(DATABASE_TABLE_NAVIGATION, new String[]{"KEY,TYPE1","LINK_NAME","DISPLAY_NAME","FORWARD_ICON","HIGHLIGHTED_ICON_WITH_TEXT","ICON_WITHOUT_TEXT","HIGHLIGHTED_ICON_WITHOUT_TEXT","Banner_Image","CHILDREN,ICON_WITH_TEXT"},
                   null, null, null, null, "Key");

           if(cursor.moveToFirst()){
               do{
                   list.add(cursor.getString(0));
               }
               while(cursor.moveToNext());
           }
           if(cursor !=null amp;amp; !cursor.isClosed()){
               cursor.close();
           }
           return list;
       }

    public WineDatabaseAdapter open() throws SQLException {
        dbHelper = new WineDatabaseHelper(context);
        database = dbHelper.getWritableDatabase();
        return this;
    }

    public void close() {
        dbHelper.close();
    }

    public long  createNavigation(String key, String type, String link_name, String display_name,String forward_icon, String highlighted_icon_with_text, String banner_image,String highlighted_icon_without_text,String icon_without_text,String children,String icon_with_text ) { 

        ContentValues initialValues = createNavigationValues(key,type,link_name,display_name, forward_icon,
                highlighted_icon_with_text, banner_image, highlighted_icon_without_text,banner_image,highlighted_icon_without_text,icon_without_text);

        return database.insert(DATABASE_TABLE, null, initialValues);
    }

    public boolean updateNavigation (long rowId,String key,String type, String link_name,String display_name, String forward_icon, String highlighted_icon_with_text, String banner_image,String highlighted_icon_without_text,String icon_without_text,String children,String icon_with_text )
    {   ContentValues updateValues = createNavigationValues(key, type,link_name,display_name, forward_icon,
            highlighted_icon_with_text, banner_image, highlighted_icon_without_text,banner_image,highlighted_icon_without_text,icon_without_text);


        return database.update(DATABASE_TABLE, updateValues, KEY_ID   "="
                  rowId, null) > 0;
    }

    public boolean deleteNavigation(long rowId) {
        return database.delete(DATABASE_TABLE, KEY_ID   "="   rowId, null) > 0;
    }

    public Cursor fetchAllNavigations() {
        return database.query(DATABASE_TABLE_NAVIGATION, new String[] { KEY_ID,TYPE1,FORWARD_ICON,LINK_NAME,HIGHLIGHTED_ICON_WITH_TEXT,Banner_Image,CHILDREN,ICON_WITHOUT_TEXT,HIGHLIGHTED_ICON_WITHOUT_TEXT,ICON_WITH_TEXT}, null, null, null,
                null, null);
    }

    public Cursor fetchNavigation(long rowId) throws SQLException {
        Cursor mCursor = database.query(true, DATABASE_TABLE_NAVIGATION, new String[] { KEY_ID,TYPE1,FORWARD_ICON,LINK_NAME,HIGHLIGHTED_ICON_WITH_TEXT,Banner_Image,CHILDREN,ICON_WITHOUT_TEXT,HIGHLIGHTED_ICON_WITHOUT_TEXT,ICON_WITH_TEXT},
                KEY_ID   "="   rowId, null, null, null, null, null);
        if (mCursor != null) {
            mCursor.moveToFirst();
        }
        return mCursor;
    }

    public long  createTodo(String iid,String type, String encoding, String data) 
    {
        ContentValues initialValues = createContentValues(iid,type, 
                 encoding, data);

        return database.insert(DATABASE_TABLE, null, initialValues);
    }

    public boolean updateTodo(long rowId,String iid, String type, 
             String encoding, String data ) {
        ContentValues updateValues = createContentValues(iid, type,
                 encoding, data);

        return database.update(DATABASE_TABLE, updateValues, KEY_ID   "="
                  rowId, null) > 0;
    }

    public boolean deleteTodo(long rowId) {
        return database.delete(DATABASE_TABLE, KEY_ID   "="   rowId, null) > 0;
    }

    public Cursor fetchAllTodos() {
        return database.query(DATABASE_TABLE, new String[] { KEY_ID,KeyIId,
                KEY_TYPE, KEY_WIDTH,KEY_HEIGHT, KEY_ENCODING, KEY_DATA }, null, null, null,
                null, null);
    }

    public Cursor fetchTodo(long rowId) throws SQLException {
        Cursor mCursor = database.query(true, DATABASE_TABLE, new String[] {
                KEY_ID,KeyIId, KEY_TYPE, KEY_WIDTH, KEY_HEIGHT, KEY_ENCODING, KEY_DATA },
                KEY_ID   "="   rowId, null, null, null, null, null);
        if (mCursor != null) {
            mCursor.moveToFirst();
        }
        return mCursor;
    }

    private ContentValues createContentValues( String iid,String type, 
             String encoding, String data) {
        ContentValues values = new ContentValues();

        values.put(KeyIId, iid);
        values.put(KEY_TYPE, type);
        values.put(KEY_ENCODING, encoding);
        values.put(KEY_DATA, data);
        return values;
    }

    private ContentValues createNavigationValues(String key,String type, String link_name,String display_name, String forward_icon, String highlighted_icon_with_text, String banner_image,String highlighted_icon_without_text,String icon_without_text,String children,String icon_with_text ) {
        ContentValues values = new ContentValues();
        values.put(KEY, key);
        values.put(TYPE1, type);
        values.put(LINK_NAME, link_name);
        values.put(DISPLAY_NAME, display_name);
        values.put(FORWARD_ICON, forward_icon);
        values.put(HIGHLIGHTED_ICON_WITH_TEXT, highlighted_icon_with_text);
        values.put(Banner_Image, banner_image);
        values.put(CHILDREN, children);
        values.put(ICON_WITHOUT_TEXT, icon_without_text);
        values.put(HIGHLIGHTED_ICON_WITHOUT_TEXT, highlighted_icon_without_text);
        values.put(ICON_WITH_TEXT, icon_with_text);
        return values;
    }
}    
  

и я вставляю эти значения в действие, которое приведено ниже, например:

      for (int ii = 0; ii < resources.length(); ii  ) 
                                            {
                                                type = resources.getJSONObject(ii).getString("type").toString();
                                                encoding = resources.getJSONObject(ii).getString("encoding").toString();
                                                data1 = resources.getJSONObject(ii).getString("data").toString();
                                                iid = resources.getJSONObject(ii).getString("id").toString();
                                                try{
                                                width=resources.getJSONObject(ii).getString("width").toString();
                                                height=resources.getJSONObject(ii).getString("height").toString();
                                                }
                                                catch(Exception e){
                                                    e.printStackTrace();
                                                }
                                                db = new WineDatabaseAdapter(HomePageWithPhoneIsOfflineDialog.this);
    db.insert(type,encoding,width,height, data1,iid);
   db.fetchAllResources()
  

Это дает мне null pointer exception on fetchAllResources() method . Вместо этого, когда я печатаю значения с помощью string builder, он печатает значения.

Редактировать:

Он возвращает нулевой массив, т.е. без каких-либо значений, таких как[]. Разве значения не вставляются в базу данных? Тогда как вставить значения в базу данных.

Кто-нибудь может сказать мне, почему это происходит. Спасибо

Ответ №1:

 public Cursor fetchAllResources() {
    return database.query(DATABASE_TABLE, new String[] { KEY_TYPE,
        KEY_ENCODING, KEY_WIDTH, KEY_WIDTH,KEY_DATA, KeyIId}, null, null, null,
        null, null);
}
  

Здесь вы используете database который никогда не инициализируется => Исключение нулевого указателя
.

Комментарии:

1. даже когда я использую db здесь, он возвращает нулевой массив

Ответ №2:

вы не можете использовать объект базы данных класса SQLiteDatabase в вашем классе адаптера, потому что этот объект будет иметь значение null, поскольку он не инициализирован.

Вместо этого поместите метод fetchAllResources() в класс databasehelper или вызовите метод open() перед использованием объекта базы данных.

Надеюсь, это поможет.

Ответ №3:

потому что при создании таблицы вы использовали KEY_TYPE, KEY_ID и т.д. В качестве имен полей, Которые принимаются как есть. Они не считаются переменной.итак, вы должны были объявить таблицу как:

 public static final String DATABASE_CREATE ="CREATE TABLE resources(type text,encoding text,width text,height text,data text ,iid text)";

public static final String DATABASE_NAVIGATION_CREATE = "create table navigation (key text,type1 text ,link_name text,display_name text ,forward_icon text ,highlighted_icon_with_text text,banner_image text,childer text,icon_without_text text, highlighted_icon_without_text text,icon_with_text text)";
  

или

 public static final String DATABASE_CREATE ="CREATE TABLE resources(" WineDatabaseAdapter.KEY_TYPE " text," WineDatabaseAdapter.KEY_ENCODING " text ," WineDatabaseAdapter.KEY_WIDTH " text," WineDatabaseAdapter.KEY_HEIGHT " text," WineDatabaseAdapter.KEY_DATA " text," WineDatabaseAdapter.KeyIId " text)";

public static final String DATABASE_NAVIGATION_CREATE = "create table navigation (" WineDatabaseAdapter.KEY " text," WineDatabaseAdapter.TYPE1 " text," WineDatabaseAdapter.LINK_NAME " text," WineDatabaseAdapter.DISPLAY_NAME " text ," WineDatabaseAdapter.FORWARD_ICON " text ," WineDatabaseAdapter.HIGHLIGHTED_ICON_WITH_TEXT " text," WineDatabaseAdapter.BANNER_IMAGE " text," WineDatabaseAdapter.CHILDREN " text," WineDatabaseAdapter.ICON_WITHOUT_TEXT " text," WineDatabaseAdapter.HIGHLIGHTED_ICON_WITHOUT_TEXT " text," WineDatabaseAdapter.ICON_WITH_TEXT " text)";
  

Редактировать :

Также добавьте эти методы в свой WineDatabaseAdapter:

 public WineDatabaseAdpater open() throws SQLException
{
    dbcreator=new DatabaseCreator(context);
    sqdb=dbcreator.getWritableDatabase();
    return this;
}
public void close()
{
    dbcreator.close();
}
  

И при использовании этого класса используйте его как

 WineDatabaseAdapter wda=new WineDatabaseAdapter(context);
wda.open();

wda.fetchAllResources();

wda.close();
  

Комментарии:

1. Извините, что говорю, но это не внесло никаких изменений

2. @ekjyot: пожалуйста, посмотрите мою правку. и, безусловно, вы не найдете такого найденного исключения из столбца, если продолжите с объявлением, как вы делали в своем вопросе.