首先看数据库效果图:(存在于assets中,与res同级)
1,读取存在于assets中的数据库
//专门用来复制数据库
private void copyDB(final String name) {
new Thread(){
public void run(){
String name = "commonnum.db";
try {
// 第一步 在本机创建一个文件和文件保存的名称
mFile = new File(getFilesDir(), name);
if(mFile.exists()&&mFile.length()>0) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(SplashActivity.this, "数据库已近存在", Toast.LENGTH_SHORT).show();
}
});
return;
}
// 第二步 读取放置在assets中的数据,读取的是一个流
InputStream is = getAssets().open(name);
// 第三步需要文件写入流
FileOutputStream fos = new FileOutputStream(mFile);
int len=0;
byte[] buffer=new byte[1024];
while ((len=is.read(buffer))!=-1){
fos.write(buffer,0,len);
}
is.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
2,实现其数据库Dao的查询功能
public class CommonDao {
//得到最外层的个数
public static int getGroupCount(SQLiteDatabase db){
int count=0;
//先获得一个可读数据库db
Cursor cursor = db.rawQuery("select count(*) from classlist", null);
cursor.moveToNext();
count= cursor.getInt(0);
return count;
}
/**
* 要得到每个最外层的item对应的子孩子的个数
* @param groupPosition
* @return
*/
public static int getChildrenCount(int groupPosition,SQLiteDatabase db){
int count=0;
int newPosition=groupPosition+1;
//先获得一个可读数据库db
String tableName="table"+newPosition;
Cursor cursor = db.rawQuery("select count(*) from " + tableName, null);
cursor.moveToNext();
count= cursor.getInt(0);
return count;
}
/**
* 查询最外层的item的内容,根据传递过来的最外层的位置
* @param groupPosition
* @return
*/
public static String getGroupView(int groupPosition,SQLiteDatabase db){
String groupName=null;
int idx=groupPosition+1;
Cursor cursor = db.query("classlist", new String[]{"name"}, "idx=?", new String[]{String.valueOf(idx)}, null, null, null);
while (cursor.moveToNext()){
groupName = cursor.getString(0);
}
return groupName;
}
/**
* 根据最外层的位置和内部的位置确定一个数据
* @param groupPosition
* @param childPosition
* @return
*/
public static String getChildView(int groupPosition, int childPosition,SQLiteDatabase db){
String name=null;
int newPosition=groupPosition+1;
String tableName="table"+newPosition;
int newChildPosition=childPosition+1;
Cursor cursor = db.query(tableName, new String[]{"name", "number"}, "_id=?", new String[]{String.valueOf(newChildPosition)}, null, null, null);
while (cursor.moveToNext()){
name = cursor.getString(0)+"\n"+ cursor.getString(1);
}
return name;
}
}
3,实现其具体的功能
public class CommonActivity extends Activity {
private ExpandableListView elv_common;
private SQLiteDatabase mDb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//已经存在的数据库可读操作
mDb = SQLiteDatabase.openDatabase("/data/data/com.m520it.mobilsafe/files/commonnum.db", null, SQLiteDatabase.OPEN_READONLY);
initView();
initData();
initEvent();
}
private void initEvent() {
elv_common.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView expandableListView, View view, int groupPosition, int childPosition, long l) {
Toast.makeText(CommonActivity.this, CommonDao.getChildView(groupPosition,childPosition,mDb), Toast.LENGTH_SHORT).show();
return false;
}
});
}
private void initData() {
elv_common.setAdapter(new CommonAdapter());
}
private void initView() {
setContentView(R.layout.activity_common);
elv_common = (ExpandableListView)findViewById(R.id.elv_common);
}
class CommonAdapter extends BaseExpandableListAdapter{
/**
* 获得最外层listView的个数
* @return
*/
@Override
public int getGroupCount() {
return CommonDao.getGroupCount(mDb);
}
/**
*
* @param groupPosition 代表第几个最外层的item
* @return 当前对应最外层item的位置的子孩子个数
*/
@Override
public int getChildrenCount(int groupPosition) {
return CommonDao.getChildrenCount(groupPosition,mDb);
}
/**
* 最外层的item的视图
* @param groupPosition
* @param b
* @param view
* @param viewGroup
* @return
*/
@Override
public View getGroupView(int groupPosition, boolean b, View view, ViewGroup viewGroup) {
TextView tv=new TextView(getApplicationContext());
tv.setTextSize(18);
tv.setTextColor(Color.BLACK);
tv.setText(" "+CommonDao.getGroupView(groupPosition,mDb));
return tv;
}
/**
* 每一个孩子的视图
* @param groupPosition
* @param childPosition
* @param b
* @param view
* @param viewGroup
* @return
*/
@Override
public View getChildView(int groupPosition, int childPosition, boolean b, View view, ViewGroup viewGroup) {
TextView tv=new TextView(getApplicationContext());
tv.setTextSize(18);
tv.setTextColor(Color.BLACK);
tv.setText(CommonDao.getChildView(groupPosition,childPosition,mDb));
return tv;
}
@Override
public Object getGroup(int i) {
return null;
}
@Override
public Object getChild(int i, int i1) {
return null;
}
@Override
public long getGroupId(int i) {
return 0;
}
@Override
public long getChildId(int i, int i1) {
return 0;
}
@Override
public boolean hasStableIds() {
return false;
}
//控制子孩子能否被选中
@Override
public boolean isChildSelectable(int i, int i1) {
return true;
}
}
@Override
protected void onPause() {
mDb.close();
super.onPause();
}
}
备注:布局文件就省略了