1. 程式人生 > >實現簡易離線資料庫快取

實現簡易離線資料庫快取

public class SQLiteHelper extends SQLiteOpenHelper {
    public SQLiteHelper(Context context) {
        super(context, "Test.db", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL("create table jsonData(id integer primary key autoincrement," +
                "url text not null," +
                "json text not null)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }
}
public class JsonDao {
    private final SQLiteHelper helper;
    public JsonDao(Context context) {
        helper = new SQLiteHelper(context);
    }
    //先刪除再新增
    public void insert(String url,String json){
        SQLiteDatabase database = helper.getWritableDatabase();
        database.delete("jsonData","url=?",new String[]{url});
        ContentValues values = new ContentValues();
        values.put("url",url);
        values.put("json",json);
        database.insert("jsonData",null,values);
    }
    //查詢
    public String select(String url){
        SQLiteDatabase database = helper.getWritableDatabase();
        Cursor cursor = database.query("jsonData", null, "url=?", new String[]{url}, null, null, null);
        String json="";
        while (cursor.moveToNext()){
            json=cursor.getString(cursor.getColumnIndex("json"));
        }
        return json;
    }
}
public class MainActivity extends AppCompatActivity {

    private PullToRefreshListView ptr_lv;
    private String urlString="http://api.expoon.com/AppNews/getNewsList/type/1/p/";
    private int page;
    private List<JavaBean.DataBean> list=new ArrayList<JavaBean.DataBean>();
    private JsonDao dao;
    private MyAdapter adapter;
    private Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == 0) {
                adapter.notifyDataSetChanged();
                ptr_lv.onRefreshComplete();
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ptr_lv = (PullToRefreshListView) findViewById(R.id.ptr_lv);
        dao = new JsonDao(MainActivity.this);
        //允許上下拉載入重新整理
        ptr_lv.setMode(PullToRefreshBase.Mode.BOTH);
        //配置介面卡
        adapter = new MyAdapter();
        ptr_lv.setAdapter(adapter);
        //獲取資料
        getNetData(0);

        ptr_lv.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
            @Override
            public void onPullDownToRefresh(PullToRefreshBase<ListView> pullToRefreshBase) {
                list.clear();
                getNetData(0);
            }
            @Override
            public void onPullUpToRefresh(PullToRefreshBase<ListView> pullToRefreshBase) {
                page++;
                getNetData(page);
            }
        });
    }

    private void getNetData(int page) {
        final String url=urlString+page;
        //判斷網路狀態
        if (NetTypeUtil.getNetType(MainActivity.this) == -1) {
            Toast.makeText(MainActivity.this, "請檢查網路連線!", Toast.LENGTH_SHORT).show();
            String json = dao.select(url);
            if (!json.isEmpty()){
                Gson gson = new Gson();
                JavaBean javaBean = gson.fromJson(json, JavaBean.class);
                list.addAll(javaBean.getData());
                adapter.notifyDataSetChanged();
                ptr_lv.onRefreshComplete();
            }
        }else{
            new Thread(){
                @Override
                public void run() {
                    super.run();
                    String netJson = NetUtil.getNetJson(url);
                    Gson gson = new Gson();
                    JavaBean javaBean = gson.fromJson(netJson, JavaBean.class);
                    list.addAll(javaBean.getData());
                    //存入資料庫
                    dao.insert(url,netJson);
                    //重新整理介面卡,關閉上下拉檢視
                    handler.sendEmptyMessage(0);
                }
            }.start();
        }
    }

    public class MyAdapter extends BaseAdapter {
        private ImageLoader imageLoaderInstance=ImageLoader.getInstance();
        @Override
        public int getCount() {
            return list.size();
        }
        @Override
        public Object getItem(int i) {
            return list.get(i);
        }
        @Override
        public long getItemId(int i) {
            return i;
        }
        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            ViewHolder holder;
            if (view==null){
                view=View.inflate(MainActivity.this, R.layout.item1_layout,null);
                holder=new ViewHolder();
                holder.img=view.findViewById(R.id.img);
                holder.text1=view.findViewById(R.id.text1);
                view.setTag(holder);
            } else {
                holder= (ViewHolder) view.getTag();
            }
            imageLoaderInstance.displayImage(list.get(i).getPic_url(), holder.img, ImageLoaderUtil.getOptions());
            holder.text1.setText(list.get(i).getNews_title());
            return view;
        }

        class ViewHolder{
            private ImageView img;
            private TextView text1;
        }
    }
}