实现简易离线数据库缓存

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;
        }
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Cordova 是一个流行的跨平台移动应用开发框架,它可以帮助开发者使用 HTML、CSS 和 JavaScript 等 Web 技术构建原生应用。 Cordova 提供了许多插件来扩展应用的功能,其中包括实现离线缓存的插件。下面是实现离线缓存的一些步骤: 1. 在 Cordova 项目中添加 cordova-plugin-file 插件来处理文件系统操作。 2. 创建一个 manifest 文件,包含应用程序需要缓存的所有资源。这个文件应该包含以下内容: CACHE MANIFEST # version 1.0 index.html js/app.js css/style.css img/logo.png 其中,以 # 开头的行是注释,第一行指定了缓存清单的名称和版本号,接下来的行是需要缓存的文件列表。 3. 修改 index.html 文件,使其引用 manifest 文件: <!DOCTYPE html> <html manifest="cache.manifest"> ... </html> 4. 在应用程序启动时,使用 JavaScript 代码加载并解析 manifest 文件。这可以通过使用 XMLHttpRequest 对象实现: var xhr = new XMLHttpRequest(); xhr.open('GET', 'cache.manifest', true); xhr.onload = function(e) { if (this.status == 200) { // parse manifest file and add resources to cache } }; xhr.send(); 5. 解析 manifest 文件,将需要缓存的资源添加到应用程序的缓存中: var cache = window.applicationCache; // listen for cache events cache.addEventListener('cached', function() { console.log('All resources cached'); }, false); cache.addEventListener('error', function() { console.log('Error caching resources'); }, false); // add resources to cache cache.update(); 6. 当应用程序离线时,可以使用缓存中的资源来显示内容: var cache = window.applicationCache; if (cache.status == cache.UPDATEREADY) { cache.swapCache(); } // use cached resources var img = new Image(); img.src = 'img/logo.png'; 这样,当应用程序离线时,它将使用缓存中的资源来显示内容,从而提高用户体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值