●程式說明
(一)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,所以這邊設定id給c1
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 )
文章標籤
全站熱搜