2015-09-25 58 views
1

我想把一個圖像的URL(字符串)到數據庫與SqlHelper類。但是,當我這樣做時,我會遇到一些錯誤。我嘗試了很多方法,但得到同樣的錯誤。也許我不能把http鏈接放在數據庫中?試圖把圖像爲sqlite

以下是我的DB助手:

public class SqlHelper { 
String title; 
    String description; 
    String image; 
    private static final String TEXT_TYPE = " TEXT"; 
    private static final String COMMA_SEP = ","; 
    public static final String KEY_ROWID = "_id"; 
    public static final String KEY_TITLE = "title"; 
    public static final String KEY_DESCRIPTION = "description"; 
    public static final String KEY_IMAGE = "image"; 
private SqlHelper mDb; 
    private static final String DATABASE_NAME = "DBCategory"; 
    private static final String DATABASE_TABLE = "categoryTable"; 
    private static final int DATABASE_VERSION = 1; 
    private static final String SQL_CREATE_ENTRIES = 
      "CREATE TABLE " + DATABASE_TABLE + " (" + 
        KEY_ROWID + " INTEGER PRIMARY KEY," + 
        KEY_TITLE + TEXT_TYPE + COMMA_SEP + 
        KEY_DESCRIPTION + TEXT_TYPE + COMMA_SEP + KEY_IMAGE + TEXT_TYPE + 

      ")"; 
    private DbHelper ourHelper; 
    private final Context ourContext; 
    private SQLiteDatabase ourDatabase; 

    public SqlHelper(Context c) throws SQLException { 
     ourContext = c; 
     try { 
      open(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 

    public SqlHelper open() throws SQLException{ 
     ourHelper = new DbHelper(ourContext); 
     ourDatabase = ourHelper.getWritableDatabase(); 
     return this; 
    } 

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





    private static class DbHelper extends SQLiteOpenHelper{ 

     public DbHelper(Context context) { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
      // TODO Auto-generated constructor stub 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" + 
          KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 
          KEY_TITLE + " TEXT NOT NULL," + KEY_IMAGE + " TEXT NOT NULL," + KEY_DESCRIPTION + " TEXT NOT NULL);" 
      ); 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE); 
      onCreate(db); 
     } 

    } 

    public long createEntry(String title, String image,String description) { 
     ContentValues cv = new ContentValues(); 
     cv.put(KEY_TITLE, title); 
     cv.put(KEY_IMAGE, image); 
     cv.put(KEY_DESCRIPTION,description); 

     return ourDatabase.insert(DATABASE_TABLE, null, cv); 
    } 

    public ArrayList<HashMap<String, String>> getAllData() 
    { 
     ArrayList<HashMap<String, String>> array_list = new ArrayList<HashMap<String, String>>(); 

     //hp = new HashMap(); 
     SQLiteDatabase db = this.ourHelper.getReadableDatabase(); 
     Cursor res = db.rawQuery("select * from categoryTable", null); 
     res.moveToFirst(); 

     while(res.isAfterLast() == false){ 

      HashMap<String,String> hashmap = new HashMap<String, String>(); 
      hashmap.put("title", res.getString(res.getColumnIndex(title))); 
      hashmap.put("description", res.getString(res.getColumnIndex(description))); 
      hashmap.put("image", res.getString(res.getColumnIndex(image))); 


      array_list.add(hashmap); 
      res.moveToNext(); 
     } 
     return array_list; 
    } 
} 

錯誤:

11910-11929/com.example.vnvbnv.myapplication E/SQLiteLog﹕ (1) table categoryTable has no column named image 
09-25 15:56:46.467 11910-11929/com.example.vnvbnv.myapplication E/SQLiteDatabase﹕ Error inserting image=http://moi-pushistye-druzya.narod.ru/images/00073.jpg title=Случайный хомяк 27 description=Случайное фото случайного хомячка. Он тут — для массовости! 
    android.database.sqlite.SQLiteException: table categoryTable has no column named image (code 1): , while compiling: INSERT INTO categoryTable(image,title,description) VALUES (?,?,?) 
      at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
      at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:909) 
      at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:520) 
      at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 
      at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) 
      at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31) 
      at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1523) 
      at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1395) 
      at com.example.vnvbnv.myapplication.SqlHelper.createEntry(SqlHelper.java:93) 
      at com.example.vnvbnv.myapplication.MainActivity$ProgressTask.doInBackground(MainActivity.java:159) 
      at com.example.vnvbnv.myapplication.MainActivity$ProgressTask.doInBackground(MainActivity.java:113) 
      at android.os.AsyncTask$2.call(AsyncTask.java:287) 
      at java.util.concurrent.FutureTask.run(FutureTask.java:234) 
      at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
      at java.lang.Thread.run(Thread.java:864) 

回答

1

你有沒有嘗試卸載你的應用程序並再次運行呢?

錯誤顯示爲「table categoryTable has no column named image」,如果您使用較少列數的數據庫表測試應用程序,並在稍後的時間點在數據庫中引入列,則會發生這種情況。

一旦您重新啓動您的應用程序與一個額外的列數據庫的舊版本已經存在,並且您的DBHelper的onCreate不會被調用,並且新列將不會被添加到您的表中。

卸載應用程序將清除任何以前的數據庫實例,並且onCreate將再次被調用,並且您將以新表格開始。