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