2011-10-10 116 views
0

我想插入一些XML數據到我的數據庫。首先,我創建了一些我傳遞給我的DBAdapter的對象的數組,以便用事務將它們插入到數據庫中,如下面的insertArticles所示。現在我想直接插入我的數據,同時解析它們,以避免在內存中創建對象數組。我看到這樣做的唯一方法是公開我的SQLiteDatabase對象並直接在我的XML解析器中創建事務。在我的DBAdapter之外有一些數據庫操作似乎不是很優雅。快速XML到數據庫

將XML數據有效載入數據庫的標準方式是什麼?

感謝

public class DBAdapter { 

    /* ... */ 

    private DatabaseHelper mDbHelper; 
    private SQLiteDatabase mDb; 

    private static class DatabaseHelper extends SQLiteOpenHelper { 

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

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      db.execSQL(CREATE_TABLE_CAT); 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      Log.w(TAG, "Upgrading database from version " + oldVersion + " to " 
        + newVersion + ", which will destroy all old data"); 
      db.execSQL("DROP TABLE IF EXISTS categories"); 
      onCreate(db); 
     } 
    } 

    public DBAdapter(Context ctx) { 
     this.mCtx = ctx; 
    } 

    public DBAdapter open() throws SQLException { 
     mDbHelper = new DatabaseHelper(mCtx); 
     mDb = mDbHelper.getWritableDatabase(); 
     return this; 
    } 

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

    public void insertArticles(List<Article> articles) { 

     mDb.beginTransaction(); 

     try{ 

      for(Article article : articles){ 


       ContentValues initialValues = new ContentValues(); 
       initialValues.put(KEY_EMID, article.id); 
       initialValues.put(KEY_TYPE_INFO, article.type_info); 
       initialValues.put(KEY_CATEGORY_ID, article.category_id); 
       initialValues.put(KEY_TITLE, article.title); 
       initialValues.put(KEY_INTRO, article.intro); 
       initialValues.put(KEY_URL_PIC, article.url_pic); 
       initialValues.put(KEY_URL_ARTICLE, article.url_article); 
       initialValues.put(KEY_DATE, article.date); 
       initialValues.put(KEY_USER_FIRSTNAME, article.user_firstname); 
       initialValues.put(KEY_USER_LASTNAME, article.user_lastname); 
       initialValues.put(KEY_NUM_COMMENTS, article.num_comments); 
       initialValues.put(KEY_CONTENT, article.content); 
       initialValues.put(KEY_IS_FAVORITE, 0);    

       String query = "SELECT " + KEY_NAME + " FROM " + DATABASE_TABLE_CAT + " WHERE " + 
       KEY_EMID + "=" + article.category_id; 
       Cursor cur = mDb.rawQuery(query, null); 
       if(cur.moveToFirst()){ 
        initialValues.put(KEY_CATEGORY_NAME, cur.getString(0)); 
       } 
       else{ 
        initialValues.put(KEY_CATEGORY_NAME, mCtx.getResources().getText(R.string.menu_home).toString()); 
       } 
       cur.close(); 

       mDb.insert(DATABASE_TABLE_ART, null, initialValues); 

      } 

      mDb.setTransactionSuccessful(); 
     } catch (SQLException e) { 
      mDb.endTransaction(); 
      throw e; 
     } finally { 
      mDb.endTransaction(); 
     } 
    } 
} 

回答

0

在我的經驗,千萬不要把XML導入數據庫,除非你找不到任何更好的解決方案。

編輯:

首先,讓我們說你需要保持信息從一些WebService接受的事情。

其次,你希望你的數據夠簡單,原始數據,刪除所有垃圾。

第三,你想保持它們的持久性,保護它的安全。

如果我是你,當從WebService接收到XML數據時,我將解析XML數據,創建一個類似於XML數據結構的數據庫模式。接下來是將分析的信息映射到數據庫模式。 因此,我可以從數據庫中獲得所需的信息,而不是所有信息。當數據已經被很好的信息過濾以便使用時,這很好。

我認爲你已經知道這些東西和這種方法。

+0

我從網絡服務中獲得它。將它保存在內存中似乎很危險,因爲系統可以隨時刪除它。持久數據有什麼更好的選擇? – jul

+0

我上面編輯過:) –