读取Assets中的文件并写入数据库然后读出

读取Assets中的文件并写入数据库然后读出

前言

1 inputStream 一直为空的原因可能是Assets的目录是之前手动创建的,创建的位置不对,所以系统无法读出
2 数据库读取数据错误的原因可能是:“_id” 误写成 “id”.

实现过程

1 读取文件并解码

 /**
     * 读取assets中的文件内容,并解析
     *
     * **/
    private String loadFromAssets(String filename) {
        String str=null;
        try {
            InputStream inputStream=getAssets().open(filename);
            str = Utils.streamToString(inputStream);

        } catch (IOException e) {
            e.printStackTrace();
        }
        byte[] bytes=fromHex(str);

        byte[] res=Base64.decode(bytes,Base64.DEFAULT);
        String ss=new String(res);
        Logger.d(ss);
        return ss;

    }
package com.example.administrator.myapplication.utils;

import java.io.IOException;
import java.io.InputStream;

/**
 * Created by Administrator on 2017/2/20.
 */

public class Utils {

    static public String streamToString(InputStream in) throws IOException {
        StringBuffer out = new StringBuffer();
        byte[] b = new byte[4096];
        for (int n; (n = in.read(b)) != -1;) {
            out.append(new String(b, 0, n));
        }
        return out.toString();
    }
}

2 将解析出来的字符串转化为Bean

/**
     * 把字符串解析成bean
     * **/
    private MyUser strToBean(String res) {
//        id_0|测试0|18729390000
        String[] strArray=res.split("\\|");
        String id=strArray[0].substring(strArray[0].length()-1,strArray[0].length());
        Logger.d(id);
        return new MyUser(Integer.parseInt(id),strArray[1],strArray[2]);
    }

3 写入数据库

//创建数据库操作类
        UserInfoDao2 dao2=new UserInfoDao2(this);
        //添加数据并判断是否成功
        if(dao2.add(user)){
            Logger.d("success");
        }else {
            Logger.d("fail");
        }
package com.example.administrator.myapplication.utils;

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

public class MyDataBaseOpenHelper extends SQLiteOpenHelper {

    /*
    * 构造方法只用传入一个Context,数据库的名字在这里制定,factory置为null,版本号初始化为1,
    * 4.0以前,版本号可以降级,4.0以后,版本号不可以降级
    * */
    public MyDataBaseOpenHelper(Context context) {
        super(context, "mydatas.db", null, 1);
    }


    /*
    * 这个方法只有在数据库创建的时候才会执行,即只会执行一次
    * 用于数据库的表的初始化
    * id 记得前面加_ ,autoincrement中间没有横杠
    * */
    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql="create table myinfos (_id integer primary key autoincrement,name varchar(20),phonenumber integer varchar(64))";
        db.execSQL(sql);
    }

    /**
     * 此方法用于数据库的更新,只有在版本号升级的时候才会执行
     *
     * **/
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}
package com.example.administrator.myapplication.utils;

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

import com.example.administrator.myapplication.bean.MyUser;
import com.orhanobut.logger.Logger;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by guang on 2017/1/9.
 */

public class UserInfoDao2 {

    private final MyDataBaseOpenHelper helper;

    public UserInfoDao2(Context context){
        helper = new MyDataBaseOpenHelper(context);
    }


    /**
     * 增加数据
     * **/
    public boolean add(MyUser user){
        SQLiteDatabase database=helper.getReadableDatabase();
        ContentValues values=new ContentValues();
        values.put("name",user.name);
        values.put("phonenumber",user.phonenumber);
        long res=database.insert("myinfos",null,values);
        database.close();
        if(res==-1){
            return false;
        }else{
            return true;
        }
    }


    /*删除数据*/
    public int delelte(String name){
        SQLiteDatabase database=helper.getReadableDatabase();
        int res=database.delete("myinfos","name=?",new String[]{name});
        database.close();
        return res;
    }



    /*查询数据*/
    public ArrayList<MyUser> select(){
        ArrayList<MyUser> mArrayList=new ArrayList<MyUser>();
        SQLiteDatabase database = helper.getReadableDatabase();
        Cursor cursor = database.query("myinfos",new String[]{"_id","name","phonenumber"},null,null,null,null,null);
        if(cursor != null && cursor.getCount()>0){
            while(cursor.moveToNext()){
                int id = cursor.getInt(cursor.getColumnIndex("_id"));
                String name = cursor.getString(cursor.getColumnIndex("name"));
                String phonenumber=cursor.getString(cursor.getColumnIndex("phonenumber"));
                MyUser user = new MyUser(id,name,phonenumber);
                mArrayList.add(user);
            }
        }
        cursor.close();
        database.close();
        return mArrayList;
    }

}

4 从数据库读出数据并显示到ListView上

 //将数据设置到ListView上
        ArrayList<MyUser> myUsers=new ArrayList<MyUser>();
        myUsers.addAll(dao2.select());

        ListView lv_query = (ListView) findViewById(R.id.lv_query);
        //2.获取查询的数据
        //3.在adapter包下封装Adapter
        //4.创建一个Adpater对象。,设置给listview
        QueryAdapter queryAdapter = new QueryAdapter(myUsers,this);
        lv_query.setAdapter(queryAdapter);

效果如下

这里写图片描述

完整代码如下:

package com.example.administrator.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Base64;
import android.widget.ListView;

import com.example.administrator.myapplication.bean.MyUser;
import com.example.administrator.myapplication.utils.UserInfoDao2;
import com.example.administrator.myapplication.utils.Utils;
import com.orhanobut.logger.Logger;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class MainActivity extends AppCompatActivity {



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //获取assets中的文件内容并进行HEX解码和BASE64解码,返回解码后的字符串
        String res=loadFromAssets("data.dat");

        //将字符串转成对象
        MyUser user=strToBean(res);
        //创建数据库操作类
        UserInfoDao2 dao2=new UserInfoDao2(this);
        //添加数据并判断是否成功
        if(dao2.add(user)){
            Logger.d("success");
        }else {
            Logger.d("fail");
        }


        //将数据设置到ListView上
        ArrayList<MyUser> myUsers=new ArrayList<MyUser>();
        myUsers.addAll(dao2.select());

        ListView lv_query = (ListView) findViewById(R.id.lv_query);
        //2.获取查询的数据
        //3.在adapter包下封装Adapter
        //4.创建一个Adpater对象。,设置给listview
        QueryAdapter queryAdapter = new QueryAdapter(myUsers,this);
        lv_query.setAdapter(queryAdapter);

    }


    /**
     * 把字符串解析成bean
     * **/
    private MyUser strToBean(String res) {
//        id_0|测试0|18729390000
        String[] strArray=res.split("\\|");
        String id=strArray[0].substring(strArray[0].length()-1,strArray[0].length());
        Logger.d(id);
        return new MyUser(Integer.parseInt(id),strArray[1],strArray[2]);
    }

    /**
     * 读取assets中的文件内容,并解析
     *
     * **/
    private String loadFromAssets(String filename) {
        String str=null;
        try {
            InputStream inputStream=getAssets().open(filename);
            str = Utils.streamToString(inputStream);

        } catch (IOException e) {
            e.printStackTrace();
        }
        byte[] bytes=fromHex(str);

        byte[] res=Base64.decode(bytes,Base64.DEFAULT);
        String ss=new String(res);
        Logger.d(ss);
        return ss;

    }



    /**
     * 将编码字符串解码为字节数组
     *
     * @param data
     * @return
     */
    public static byte[] fromHex(String data) {

        byte[] ret = null;
        //todo 将字符串转换为字节数组
        if (data != null) {
            int len = data.length();
            char[] chs = data.toCharArray();
            ret = new byte[len/2];
            int ih = 0,il=0,v=0,j=0;
            if (len > 0 && len % 2 == 0) {
                for (int i = 0; i < len - 1; i += 2,j++) {
                    char ch = chs[i];
                    char cl = chs[i+1];

                    if(ch>='A'&&ch<='F'){
                        ih = 10 + (ch - 'A');
                    }else if(ch >='a'&&ch<='f'){
                        ih = 10 + (ch - 'a');
                    }else if(ch>'0'&&ch<='9'){
                        ih = ch - '0';
                    }

                    if(cl>='A'){
                        il = 10 + (cl - 'A');
                    }else if(cl >='a'){
                        il = 10 + (cl - 'a');
                    }else if(cl>'0'){
                        il = cl - '0';
                    }
                    v = ((ih&0x0f)<<4)|(il&0x0f);
                    ret[j] = (byte)v;

                }
            }
        }
        return ret;
    }
}
package com.example.administrator.myapplication.utils;

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

public class MyDataBaseOpenHelper extends SQLiteOpenHelper {

    /*
    * 构造方法只用传入一个Context,数据库的名字在这里制定,factory置为null,版本号初始化为1,
    * 4.0以前,版本号可以降级,4.0以后,版本号不可以降级
    * */
    public MyDataBaseOpenHelper(Context context) {
        super(context, "mydatas.db", null, 1);
    }


    /*
    * 这个方法只有在数据库创建的时候才会执行,即只会执行一次
    * 用于数据库的表的初始化
    * id 记得前面加_ ,autoincrement中间没有横杠
    * */
    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql="create table myinfos (_id integer primary key autoincrement,name varchar(20),phonenumber integer varchar(64))";
        db.execSQL(sql);
    }

    /**
     * 此方法用于数据库的更新,只有在版本号升级的时候才会执行
     *
     * **/
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}
package com.example.administrator.myapplication.bean;

public class MyUser {
    public int id;
    public String name;
    public String phonenumber;

    public MyUser(){

    }

    public MyUser(int id,String name,String phonenumber){
        this.id=id;
        this.name=name;
        this.phonenumber=phonenumber;
    }


}
package com.example.administrator.myapplication.utils;

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

import com.example.administrator.myapplication.bean.MyUser;
import com.orhanobut.logger.Logger;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by guang on 2017/1/9.
 */

public class UserInfoDao2 {

    private final MyDataBaseOpenHelper helper;

    public UserInfoDao2(Context context){
        helper = new MyDataBaseOpenHelper(context);
    }


    /**
     * 增加数据
     * **/
    public boolean add(MyUser user){
        SQLiteDatabase database=helper.getReadableDatabase();
        ContentValues values=new ContentValues();
        values.put("name",user.name);
        values.put("phonenumber",user.phonenumber);
        long res=database.insert("myinfos",null,values);
        database.close();
        if(res==-1){
            return false;
        }else{
            return true;
        }
    }


    /*删除数据*/
    public int delelte(String name){
        SQLiteDatabase database=helper.getReadableDatabase();
        int res=database.delete("myinfos","name=?",new String[]{name});
        database.close();
        return res;
    }



    /*查询数据*/
    public ArrayList<MyUser> select(){
        ArrayList<MyUser> mArrayList=new ArrayList<MyUser>();
        SQLiteDatabase database = helper.getReadableDatabase();
        Cursor cursor = database.query("myinfos",new String[]{"_id","name","phonenumber"},null,null,null,null,null);
        if(cursor != null && cursor.getCount()>0){
            while(cursor.moveToNext()){
                int id = cursor.getInt(cursor.getColumnIndex("_id"));
                String name = cursor.getString(cursor.getColumnIndex("name"));
                String phonenumber=cursor.getString(cursor.getColumnIndex("phonenumber"));
                MyUser user = new MyUser(id,name,phonenumber);
                mArrayList.add(user);
            }
        }
        cursor.close();
        database.close();
        return mArrayList;
    }

}
package com.example.administrator.myapplication.utils;

import java.io.IOException;
import java.io.InputStream;

/**
 * Created by Administrator on 2017/2/20.
 */

public class Utils {

    static public String streamToString(InputStream in) throws IOException {
        StringBuffer out = new StringBuffer();
        byte[] b = new byte[4096];
        for (int n; (n = in.read(b)) != -1;) {
            out.append(new String(b, 0, n));
        }
        return out.toString();
    }
}
package com.example.administrator.myapplication;

import java.util.ArrayList;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import com.example.administrator.myapplication.bean.MyUser;

public class QueryAdapter extends BaseAdapter {

    private ArrayList<MyUser> lists;
    private Context context;

    public QueryAdapter(ArrayList<MyUser> arrayList, Context context) {
        this.lists = arrayList;
        this.context = context;
    }

    @Override
    public int getCount() {
        return lists.size();
    }

    @Override
    public Object getItem(int position) {
        return lists.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = null;
        if (convertView != null) {
            view = convertView;
        } else {
            view = View.inflate(context, R.layout.item_query, null);
        }
        TextView item_id = (TextView) view.findViewById(R.id.my_id);
        TextView item_tv_name = (TextView) view.findViewById(R.id.item_tv_name);
        TextView item_phone = (TextView) view.findViewById(R.id.item_tv_phone);

        MyUser userBean = lists.get(position);
        item_id.setText("id_"+userBean.id);
        item_tv_name.setText(userBean.name);
        item_phone.setText(userBean.phonenumber+"");

        return view;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值