2017-08-02 29 views
1

我剛剛開始學習Android開發,並且發現了一種在我的應用程序中編寫模型,DAO和模式的非常好的方法。例如,我有一個Category模型,其中將包含所有的字段表示數據庫的表中的列:在Android中編寫數據庫CRUD操作的更有效方法

public class Category { 
    private int id; 
    private String name; 
    private String createdAt; 

    // Getters and Setters 
} 

CategoryDao類屆時將響應來訪問數據庫,並執行所有操作:

package com.prettypenny.dao; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

import com.prettypenny.model.Category; 
import com.prettypenny.schema.CategorySchema; 
import com.prettypenny.schema.DatabaseHandler; 

import java.util.ArrayList; 

/** 
* Category D.A.O 
*/ 
public class CategoryDao { 
    SQLiteOpenHelper helper; 
    SQLiteDatabase database; 

    private static final String[] columns = { 
     CategorySchema.COL_ID, 
     CategorySchema.COL_NAME, 
     CategorySchema.COL_CREATED_AT, 
    }; 

    public CategoryDao(Context context) { 
     helper = new DatabaseHandler(context); 
    } 

    public void open() { 
     database = helper.getWritableDatabase(); 
    } 

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

    /** 
    * Retrieve all Category 
    * @return ArrayList 
    */ 
    public ArrayList<Category> all() { 
     Cursor cursor = database.query(CategorySchema.TABLE_NAME, columns, null, null, null, null, null); 

     ArrayList<Category> categories = new ArrayList<>(); 

     if (cursor.getCount() > 0) { 
      while (cursor.moveToNext()) { 
       Category category = new Category(); 
       category.setId(cursor.getInt(cursor.getColumnIndex(CategorySchema.COL_ID))); 
       category.setName(cursor.getString(cursor.getColumnIndex(CategorySchema.COL_NAME))); 

       categories.add(category); 
      } 
     } 

     return categories; 
    } 

    /** 
    * Inserts a new Category 
    * @param category Category category to be inserted 
    * @return Category 
    */ 
    public Category insert(Category category) { 
     ContentValues values = new ContentValues(); 
     values.put(CategorySchema.COL_NAME, category.getName()); 

     database.insert(CategorySchema.TABLE_NAME, null, values); 

     return category; 
    } 

    /** 
    * Updates an existing Category 
    * @param category Category category to be updated 
    * @return int 
    */ 
    public int update(Category category) { 
     ContentValues values = new ContentValues(); 
     values.put(CategorySchema.COL_NAME, category.getName()); 

     return database.update(
      CategorySchema.TABLE_NAME, 
      values, 
      CategorySchema.COL_ID + " = ?", 
      new String[] { String.valueOf(category.getId()) } 
     ); 
    } 

    /** 
    * Deletes an existing Category 
    * @param id int id of the category to be deleted 
    */ 
    public void delete(int id) { 
     database.delete(
      CategorySchema.TABLE_NAME, 
      CategorySchema.COL_ID + " = " + id, 
      null 
     ); 
    } 
} 

但正如我在我的應用程序創造越來越多的實體,我覺得不屑於必須鍵入所有這些相同的事情,所以我覺得做一個抽象類Dao,將有所有的這些操作和班會剛擴展它。

abstract class Dao { 
    SQLiteOpenHelper helper; 
    SQLiteDatabase database; 

    public ArrayList<?> all(String tableName, String[] columns) { 
     Cursor cursor = database.query(tableName, columns, null, null, null, null, null); 

     ArrayList<?> entities = new ArrayList<>(); 

     if (cursor.getCount() > 0) { 
      while (cursor.moveToNext()) { 
       // Oh shit. 
      } 
     } 

     return entities; 
    } 
} 

現在的問題,例如,在all()方法是要實例化的模型類,如在實例化CategoryDao.all()Category。在抽象類中是否有可能實現類似ArrayList<?>這樣的類似的東西,它在哪裏傳遞可能是任何類型的東西?

+1

是否可以使用一些ORM,甚至是另一個便於執行的數據庫?我有一些建議。 –

+0

我從來沒有想過使用ORM,實際上並不知道有。但是我真的很想知道我的問題,如果那可能,而且對我來說更多地學習Java。 – mfgabriel92

+0

ORM是對象關係映射。它們是便於將實體作爲對象進行管理的庫。對於Java EE最流行的是Hibernate。 –

回答

2

使用任何語言處理數據庫時遇到的最大挑戰之一是數據庫表與實體對象之間的關係映射。

想一想,是創建的庫/框架稱爲ORM(對象關係映射)。

我的第一個建議是使用Realm Database,但既然你已經使用SQLite的工作,我的名單是:

他們之間的比較可以找到herehere

+0

好的,有很多選擇。我想用思考來實現我的想法,以更多地理解Java語言本身。謝謝。 – mfgabriel92

+1

請注意Android上的反思。反思速度慢,成本高。通常,在Android中,ORM使用代碼生成來避免使用反射。祝你好運。 –

0

我建議你看看谷歌的房間方法。它仍然不穩定,你需要android studio 3.0,但仍然不穩定,但我沒有注意到任何問題。

https://codelabs.developers.google.com/codelabs/android-persistence/#0

它擁有典型的替代方案,其中之一是檢查你的SQL語句符合您在編譯時分貝非常有趣的優勢。我不知道有其他人提供此特定功能。

相關問題