●程式說明

(一)DAO與SQLite的教學可參考此篇文章
 

(二)MemoryDAO Implement (關掉app就沒了,所以沒有實用性,這邊只是知道該怎麼做)
public class CusomerDAOMemoryImpl implements CustomerDAO {
    ArrayList<customer> datalist=new ArrayList<>();
    int id=1;
    @Override
    public void addOne(customer c) {
        //因為不是寫進資料庫,所以id不會自動給定,要自己寫入
        c.id this.id;
        this.id++;
        datalist.add(c);
    }
 
    @Override
    public customer getOne(int id) {
        //因為可能會找不到資料,所以會是null
        customer rtValue = null;
        //跑回圈找id對的回傳
        for (customer tmp : datalist)
        {
            if (tmp.id == id)
            {
                rtValue = tmp;
                break;
            }
        }
        return rtValue;
    }
 
    @Override
    public void clearAll() {
        datalist.clear();
    }
 
    @Override
    public customer[] getList() {
        return datalist.toArray(new customer[datalist.size()]);
    }
 
    @Override
    public void delete(customer c) {
        datalist.remove(c);
    }
 
    @Override
    public void update(customer c) {
        for (customer tmp : datalist)
        {
            if (tmp.id == c.id)
            {
                tmp.name = c.name;
                tmp.addr = c.addr;
                tmp.tel = c.tel;
                break;
            }
        }
    }
}
 
**寫測試程式,因為MemoryDAO和手機無關,可以直接寫一般的測試程式,不用寫androidTest
public class MyMemorDAOTest {
 
@Test
public void clearAndAddOneDataAndGetTest() {
CusomerDAOMemoryImpl dao = new CusomerDAOMemoryImpl();
customer c = new customer();
c.name = "BBB";
c.tel = "123";
c.addr = "aabb";
dao.clearAll();
dao.addOne(c);
customer cArray[] = dao.getList();
assertEquals("BBB", String.valueOf(cArray[0].name));
 
}
 
@Test
//測試刪除
public void testDelete1() {
CusomerDAOMemoryImpl dao = new CusomerDAOMemoryImpl();
customer c1 = new customer("ccc", "333", "123456");
customer c2 = new customer("ddd", "444", "123456");
dao.clearAll();
dao.addOne(c1);
dao.addOne(c2);
customer cArray[] = dao.getList();
//因為前面new c1時沒有給id,所以這邊設定idc1
c1.id = cArray[0].id;
dao.delete(c1);
customer cArray2[] = dao.getList();
assertEquals("ddd", cArray2[0].name);
}
@Test
//測試更新
public void testUpdate() {
CusomerDAOMemoryImpl dao = new CusomerDAOMemoryImpl();
customer c1 = new customer("ccc", "333", "123456");
 
dao.clearAll();
dao.addOne(c1);
customer carray[] = dao.getList();
c1.id = carray[0].id;
c1.name = "fff";
dao.update(c1);
customer carray2[] = dao.getList();
assertEquals("fff", carray2[0].name);
}
}
 
(三)寫到app中要大改,不能直接用舊的程式,因為memory每new一次就會是一個新的,這樣會找不到資料
(1)新增一個DAOApplication並修改mainfeast
android:name=".DAOApplication"
public class DAOApplication extends Application {
public CustomerDAO dao = new CusomerDAOMemoryImpl();
}
 
 
(2)新增一個DAOFactory
public class CustomerDAOFactory {
public static CustomerDAO getDAO(Context context, DAOType dt)
{
//因為傳進來的是ACTIVITY,要把CONTEXT轉成ACTIVITY
Activity act = (Activity) context;
DAOApplication app = (DAOApplication) act.getApplication();
CustomerDAO dao = null;
switch(dt)
{
case Memory:
dao = app.dao;
break;
case DB:
dao = new CustomerDAODBImpl(context);
break;
}
return dao;
}
}
 
 
(3)新增enum DAOType
//列舉DAO類型
public enum DAOType {
Memory,DB
}
 
 
 
(4)修改舊程式有new CustomerDAO之處
mainactivity改
 
1.在最外面宣告DAOType
//只要控制MainActivity DAOType,就可ˇ決定要存到記憶體還是資料庫
public static DAOType dt = DAOType.Memory;
 
2.
super.onResume();
CustomerDAO dao=  CustomerDAOFactory.getDAO(MainActivity.this, MainActivity.dt);
customer[] cust = dao.getList();
...
sec改
CustomerDAO cdd=  CustomerDAOFactory.getDAO(sec.this, MainActivity.dt);
customer c=new customer();
...
 
editinfo改
1.
int index=Integer.parseInt(i);
CustomerDAO dao= CustomerDAOFactory.getDAO(editeInfo.this, MainActivity.dt);
...
2.
public void delete(View view) {
    CustomerDAO dao=  CustomerDAOFactory.getDAO(editeInfo.this, MainActivity.dt);
...
3.
public void update(View view) {
    CustomerDAO dao=  CustomerDAOFactory.getDAO(editeInfo.this, MainActivity.dt);
...
 
(四)寫到json中(資料會寫在檔案中)
(1)Enum要新增File,並且把mainActivity的DAOType改為File
 
(2)新增一個class
public class CustomerDAOFileImpl implements CustomerDAO {
ArrayList<customer> datalist = new ArrayList();
String File_Name = null;
 
//要建constructor
public CustomerDAOFileImpl(Context context)
{
//因為filename在建構式中不能直接getFileDir(),因為這是我們自己寫的類別,所以要先取得activity
Activity act = (Activity) context;
File_Name = act.getFilesDir().getAbsolutePath() + File.separator + "mydata.json";
FileReader fr = null;
try {
//要確保檔案存在,檢查檔案有存在才能讀取
File f = new File(File_Name);
if (f.exists())
{
fr = new FileReader(File_Name);
BufferedReader br = new BufferedReader(fr);
String str = br.readLine();
//因為讀進來的是json檔,所以可以用gson
Gson gson = new Gson();
datalist = gson.fromJson(str, new TypeToken<ArrayList<customer>>(){}.getType());
br.close();
fr.close();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//要新增一個寫入檔案的程式,只要有做修改最後都要做save to file的動作
private void saveFile()
{
Gson gson = new Gson();
String str = gson.toJson(datalist);
FileWriter fw = null;
try {
fw = new FileWriter(File_Name);
BufferedWriter bw = new BufferedWriter(fw);
bw.write(str);
bw.close();
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
 
@Override
public void addOne(customer c) {
datalist.add(c);
saveFile();
}
 
@Override //getOne因為沒有做修改所以不需要save to file做法就跟memory一樣
public customer getOne(int id) {
customer rtValue = null;
for (customer tmp : datalist)
{
if (tmp.id == id)
{
rtValue = tmp;
break;
}
}
return rtValue;
}
 
@Override
public void clearAll() {
datalist.clear();
saveFile();
}
 
@Override
public customer[] getList() {
return datalist.toArray(new customer[datalist.size()]);
}
 
@Override
public void delete(customer c) {
datalist.remove(c);
saveFile();
}
 
@Override
public void update(customer c) {
for (customer tmp : datalist)
{
if (tmp.id == c.id)
{
tmp.name = c.name;
tmp.addr = c.addr;
tmp.tel = c.tel;
break;
}
}
saveFile();
}
}
 

●程式參考(GitHub):透過Enum選擇Data Storage的方式(SQLite, FileWriter, Memory )

arrow
arrow
    創作者介紹
    創作者 muchone 的頭像
    muchone

    簡單。生活。享受

    muchone 發表在 痞客邦 留言(0) 人氣()