本文实例讲述了AndroID *** 作sqlite数据库(增、删、改、查、分页等)及ListVIEw显示数据的方法。分享给大家供大家参考,具体如下:
由于刚接触androID开发,故此想把学到的基础知识记录一下,以备查询,故此写的比较拢
步骤如下:
一、介绍:
此文主要是介绍怎么使用androID自带的数据库sqlite,以及把后台的数据用ListVIEw控件显示
二、新建一个androID工程――DBsqliteOperate
工程目录:
三、清单列表AndroIDManifest.xml的配置为:
<?xml version="1.0" enCoding="utf-8"?><manifest xmlns:androID="http://schemas.androID.com/apk/res/androID" package="com.example.dboperate" androID:versionCode="1" androID:versionname="1.0" > <uses-sdk androID:minSdkVersion="8" /> <application androID:icon="@drawable/ic_launcher" androID:label="@string/app_name" > <!--单元测试 加这句--> <uses-library androID:name="androID.test.runner" /> <activity androID:name=".DBsqliteOperateActivity" androID:label="@string/app_name" > <intent-filter> <action androID:name="androID.intent.action.MAIN" /> <category androID:name="androID.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <instrumentation androID:name="androID.test.InstrumentationTestRunner" androID:targetPackage="com.example.dboperate" androID:label="Test for my app"/></manifest>
四、main.xml配置清单:
<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="fill_parent" androID:layout_height="fill_parent" androID:orIEntation="vertical" > <linearLayout androID:layout_wIDth="fill_parent" androID:layout_height="wrap_content" androID:orIEntation="horizontal" > <TextVIEw androID:ID="@+ID/name" androID:layout_wIDth="100dip" androID:layout_height="wrap_content" androID:text="@string/name" androID:gravity="center"/> <TextVIEw androID:ID="@+ID/phone" androID:layout_wIDth="100dip" androID:layout_height="wrap_content" androID:text="@string/phone" androID:gravity="center"/> <TextVIEw androID:ID="@+ID/amount" androID:layout_wIDth="fill_parent" androID:layout_height="wrap_content" androID:text="@string/amount" androID:gravity="center"/></linearLayout> <ListVIEw androID:ID="@+ID/ListVIEw" androID:layout_wIDth="fill_parent" androID:layout_height="fill_parent" > </ListVIEw></linearLayout>
五、item.xml配置清单:
<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="fill_parent" androID:layout_height="fill_parent" androID:orIEntation="horizontal" > <TextVIEw androID:ID="@+ID/name" androID:layout_wIDth="100dip" androID:layout_height="wrap_content" androID:text="@string/name" androID:gravity="center"/> <TextVIEw androID:ID="@+ID/phone" androID:layout_wIDth="100dip" androID:layout_height="wrap_content" androID:text="@string/phone" androID:gravity="center"/> <TextVIEw androID:ID="@+ID/amount" androID:layout_wIDth="fill_parent" androID:layout_height="wrap_content" androID:text="@string/amount" androID:gravity="center"/></linearLayout>
六、string.xml配置清单:
<?xml version="1.0" enCoding="utf-8"?><resources> <string name="hello">Hello World,DBsqliteOperateActivity!</string> <string name="app_name">ExampleDBsqliteOperate8</string> <string name="name">姓名</string> <string name="phone">电话</string> <string name="amount">存款</string></resources>
七、DBsqliteOperateActivity.java Activity类的源码:
package com.example.dboperate;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import com.example.adapter.PersonAdapter;import com.example.domain.Person;import com.example.service.PersonService;import androID.app.Activity;import androID.database.Cursor;import androID.os.Bundle;import androID.vIEw.VIEw;import androID.vIEw.VIEw.OnClickListener;import androID.Widget.AdapterVIEw;import androID.Widget.AdapterVIEw.OnItemClickListener;import androID.Widget.ListVIEw;import androID.Widget.SimpleAdapter;import androID.Widget.SimpleCursorAdapter;import androID.Widget.Toast;public class DBsqliteOperateActivity extends Activity { ListVIEw ListVIEw; PersonService personService; OnItemClickListener ListVIEwListener; /** Called when the activity is first created. */ @OverrIDe public voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.main); ListVIEwListener = new OnItemClickListener(){ @OverrIDe public voID onItemClick(AdapterVIEw<?> parent,VIEw vIEw,int position,long ID) { //得到ListVIEw控件 ListVIEw ListVIEw = (ListVIEw)parent; //1、如果使用自定义适配器,返回的是Person对象 //得到该条目数据// Person person = (Person)ListVIEw.getItemAtposition(position);// //广播出去// Toast.makeText(getApplicationContext(),person.toString(),Toast.LENGTH_LONG).show(); //2、如果使用showList2()方法中的适配器时,则取得的值是不一样的,返回的是cursor// Cursor cursor = (Cursor)ListVIEw.getItemAtposition(position);// int personID = cursor.getInt(cursor.getColumnIndex("_ID"));// Toast.makeText(getApplicationContext(),personID+"",Toast.LENGTH_LONG).show(); //3、如果使用showList()方法中的适配器时,则取得的值是不一样的,返回的是map @SuppressWarnings("unchecked") Map<String,Object> map = (Map)ListVIEw.getItemAtposition(position); String name = map.get("name").toString(); String personID = map.get("personID").toString(); Toast.makeText(getApplicationContext(),personID +"-"+ name,Toast.LENGTH_LONG).show(); } }; ListVIEw = (ListVIEw) this.findVIEwByID(R.ID.ListVIEw); ListVIEw.setonItemClickListener(ListVIEwListener); personService = new PersonService(this); showList(); } private voID showList() { List<Person> persons = personService.getScrollData(0,50); List<HashMap<String,Object>> data = new ArrayList<HashMap<String,Object>>(); for(Person person : persons){ HashMap<String,Object> item = new HashMap<String,Object>(); item.put("name",person.getname()); item.put("phone",person.getPhone()); item.put("amount",person.getAmount()); item.put("personID",person.getID()); data.add(item); } SimpleAdapter adapter = new SimpleAdapter(this,data,R.layout.item,new String[]{"name","phone","amount"},new int[]{R.ID.name,R.ID.phone,R.ID.amount}); ListVIEw.setAdapter(adapter); } public voID showList2(){ Cursor cursor = personService.getCursorScrollData(0,50); //该适配器要求返回的结果集cursor必须包含_ID字段,所以需要对取得结果集进行处理 SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,cursor,R.ID.amount} ); ListVIEw.setAdapter(adapter); } /** * 自定义适配器 */ public voID showList3(){ List<Person> persons = personService.getScrollData(0,50); /** * 第一个参数:上下文context,第二个参数:要显示的数据,第三个参数:绑定的条目界面 */ PersonAdapter adapter = new PersonAdapter(this,persons,R.layout.item); ListVIEw.setAdapter(adapter); }}
八、person.java 实体类 源码:
package com.example.domain;public class Person { private Integer ID; private String name; private String phone; private Integer amount; public Integer getID() { return ID; } public voID setID(Integer ID) { this.ID = ID; } public String getname() { return name; } public voID setname(String name) { this.name = name; } public String getPhone() { return phone; } public voID setPhone(String phone) { this.phone = phone; } public Person(String name,String phone) { this.name = name; this.phone = phone; } public Person(Integer ID,String name,String phone,Integer amount) { super(); this.ID = ID; this.name = name; this.phone = phone; this.amount = amount; } public Person() { super(); } public Integer getAmount() { return amount; } public voID setAmount(Integer amount) { this.amount = amount; } @OverrIDe public String toString() { return "Person [ID=" + ID + ",name=" + name + ",phone=" + phone + ",amount=" + amount + "]"; }}
九、DBOperateHelper.java 业务类源码:
package com.example.service;import androID.content.Context;import androID.database.sqlite.sqliteDatabase;import androID.database.sqlite.sqliteDatabase.CursorFactory;import androID.database.sqlite.sqliteOpenHelper;public class DBOperateHelper extends sqliteOpenHelper { public DBOperateHelper(Context context) {//默认创建的数据库文件保存在<包名>/database/ //第一个参数是上下文,第二个参数是数据库名称,第三个是游标工厂为null时使用 数据库默认的游标工厂,第四个是数据库版本号但是不能为0,一般大于0 super(context,"smallpig",null,4); } /** * 数据库每一次被创建时被调用 */ @OverrIDe public voID onCreate(sqliteDatabase sqldb) { sqldb.execsql("create table person(personID integer primary key autoincrement,name varchar(20),phone varchar(12) null)"); } /** * 每一次数据库版本号发生变动时触发此方法 * 比如如果想往数据库中再插入一些表、字段或者其他信息时通过修改数据库版本号来触发此方法 */ @OverrIDe public voID onUpgrade(sqliteDatabase db,int oldVersion,int newVersion) { //db.execsql("alter table person add phone varchar(12) null");\ db.execsql("alter table person add amount Integer null"); }}
十、PersonService.java 业务类源码:
package com.example.service;import java.util.ArrayList;import java.util.List;import androID.content.Context;import androID.database.Cursor;import androID.database.sqlite.sqliteDatabase;import com.example.domain.Person;public class PersonService { private DBOperateHelper dbOperateHelper; public PersonService(Context context) { this.dbOperateHelper = new DBOperateHelper(context); } /** * 保存记录 * @param person */ public voID save(Person person){ //得到数据库实例,里面封装了数据库 *** 作方法 sqliteDatabase sqldb = dbOperateHelper.getWritableDatabase(); //sqldb.execsql("insert into person(name,phone) values('"+person.getname()+"','"+person.getPhone()+"')"); //利用占位符可以避免注入,但是注意数组参与与占位符对应的字段要一一对应 sqldb.execsql("insert into person(name,phone,amount) values(?,?,?)",new Object[]{person.getname(),person.getPhone(),person.getAmount()}); //关闭数据库 sqldb.close(); } /** * 删除记录 * @param ID */ public voID delete(Integer ID){ sqliteDatabase sqldb = dbOperateHelper.getWritableDatabase(); sqldb.execsql("delete from person where personID=?",new Object[]{ID}); sqldb.close(); } /** * 更新记录 * @param person */ public voID update(Person person){ sqliteDatabase sqldb = dbOperateHelper.getWritableDatabase(); sqldb.execsql("update person set name=?,phone=?,amount=? where personID=?",person.getAmount(),person.getID()}); sqldb.close(); } /** * 通过ID查询记录 * @param ID * @return */ public Person find(Integer ID){ /** * getWritableDatabase 与 getReadableDatabase 的区别: * getReadableDatabase会先返回getWritableDatabase(可写),如果调用getWritableDatabase失败 * 则才会调用getReadableDatabase后续方法,使数据库只读 * 当写入的数据超过数据库大小则调用getWritableDatabase会失败 * 所以只读时则可以使用此方法,其它情况(只要不是超过数据库大小)也可以使用此方法 */ sqliteDatabase sqldb = dbOperateHelper.getReadableDatabase(); Cursor cursor = sqldb.rawquery("select * from person where personID=?",new String[]{String.valueOf(ID)}); int personID; String name; String phone; int amount; Person person = null; if(cursor.movetoFirst()){ personID = cursor.getInt(cursor.getColumnIndex("personID")); name = cursor.getString(cursor.getColumnIndex("name")); phone = cursor.getString(cursor.getColumnIndex("phone")); amount = cursor.getInt(cursor.getColumnIndex("amount")); person = new Person(personID,name,amount); } cursor.close(); return person; } /** * 返回指定长度记录,limit 3,5,适用于分页 * @param offset 起始 * @param maxResult 长度 * @return */ public List<Person> getScrollData(int offset,int maxResult){ sqliteDatabase sqldb = dbOperateHelper.getReadableDatabase(); Cursor cursor = sqldb.rawquery("select * from person order by personID asc limit ?,?",new String[]{String.valueOf(offset),String.valueOf(maxResult)}); int personID; String name; String phone; int amount; Person person = null; List<Person> persons = new ArrayList<Person>(); while(cursor.movetoNext()){ personID = cursor.getInt(cursor.getColumnIndex("personID")); name = cursor.getString(cursor.getColumnIndex("name")); phone = cursor.getString(cursor.getColumnIndex("phone")); amount = cursor.getInt(cursor.getColumnIndex("amount")); person = new Person(personID,amount); persons.add(person); } cursor.close(); return persons; } /** * 返回cursor * @param offset 起始 * @param maxResult 长度 * @return */ public Cursor getCursorScrollData(int offset,int maxResult){ sqliteDatabase sqldb = dbOperateHelper.getReadableDatabase(); Cursor cursor = sqldb.rawquery("select personID as _ID,amount from person order by personID asc limit ?,String.valueOf(maxResult)}); return cursor; } /** * 返回总记录数 * @return */ public long getCount(){ sqliteDatabase sqldb = dbOperateHelper.getReadableDatabase(); Cursor cursor = sqldb.rawquery("select count(*) from person",null); //该查询语句值返回一条语句 cursor.movetoFirst(); long result = cursor.getLong(0); cursor.close(); return result; } public voID payment(){ sqliteDatabase sqldb = dbOperateHelper.getWritableDatabase(); sqldb.beginTransaction();//开启事务 try{ sqldb.execsql("update person set amount = amount -10 where personID=1"); sqldb.execsql("update person set amount = amount + 10 where personID=2"); sqldb.setTransactionSuccessful();//设置事务标志位true } finally { //结束事务:有两种情况:commit\rollback,事务提交或者回滚是由事务的标识决定的 //事务为ture则提交,事务为flase则回滚,默认为false sqldb.endTransaction(); } }}
十一、OtherPersonService.java 业务类源码:
package com.example.service;import java.util.ArrayList;import java.util.List;import com.example.domain.Person;import androID.content.ContentValues;import androID.content.Context;import androID.database.Cursor;import androID.database.sqlite.sqliteDatabase;import androID.database.sqlite.sqliteDatabase.CursorFactory;import androID.database.sqlite.sqliteOpenHelper;public class OtherPersonService { private DBOperateHelper dbOperateHelper; public OtherPersonService(Context context) { this.dbOperateHelper = new DBOperateHelper(context); } /** * 保存记录 * @param person */ public voID save(Person person){ //得到数据库实例,里面封装了数据库 *** 作方法 sqliteDatabase sqldb = dbOperateHelper.getWritableDatabase(); //sqldb.execsql("insert into person(name,'"+person.getPhone()+"')"); //利用占位符可以避免注入,但是注意数组参与与占位符对应的字段要一一对应 //sqldb.execsql("insert into person(name,phone) values(?,person.getPhone()}); ContentValues values = new ContentValues(); values.put("name",person.getname()); values.put("phone",person.getPhone()); values.put("amount",person.getAmount()); //第一个参数是表名,第三个为字段值集合,第二个参数是空值字段,当第三个字段值集合为空时,系统会自动插入一条第二个参数为空的SQL语句 //否则当第三个参数为空时,如果第二个参数也为空,那么插入表就会找不到插入的字段信息,会报错 sqldb.insert("person","name",values ); //关闭数据库 sqldb.close(); } /** * 删除记录 * @param ID */ public voID delete(Integer ID){ sqliteDatabase sqldb = dbOperateHelper.getWritableDatabase(); //sqldb.execsql("delete from person where personID=?",new Object[]{ID}); //第一个参数是表名,第二个是where后面的条件用占位符表示,第三个对应占位符为参数值 sqldb.delete("person","personID=?",new String[]{Integer.toString(ID)}); sqldb.close(); } /** * 更新记录 * @param person */ public voID update(Person person){ sqliteDatabase sqldb = dbOperateHelper.getWritableDatabase(); //sqldb.execsql("update person set name=?,phone=? where personID=?",person.getID()}); //第一个参数为表名,第二个是一个更新值集合,采用键值对的形式,每个更新的字段对应更新值 //第三个参数是where后面条件字段用占位符标识,第四个参数是对应where占位符的值 ContentValues values = new ContentValues(); values.put("name",person.getAmount()); sqldb.update("person",values,new String[]{person.getID().toString()}); sqldb.close(); } /** * 通过ID查询记录 * @param ID * @return */ public Person find(Integer ID){ /** * getWritableDatabase 与 getReadableDatabase 的区别: * getReadableDatabase会先返回getWritableDatabase(可写),如果调用getWritableDatabase失败 * 则才会调用getReadableDatabase后续方法,使数据库只读 * 当写入的数据超过数据库大小则调用getWritableDatabase会失败 * 所以只读时则可以使用此方法,其它情况(只要不是超过数据库大小)也可以使用此方法 */ sqliteDatabase sqldb = dbOperateHelper.getReadableDatabase(); //Cursor cursor = sqldb.rawquery("select * from person where personID=?",new String[]{String.valueOf(ID)}); //第一个参数是表名;第二个参数是查询显示的字段,null时默认查询显示所有字段; //第三个参数是where查询条件占位符;第四个是占位符对应的值; //第五个参数是group by条件;第六个是having条件;第七个是order by条件 Cursor cursor = sqldb.query("person",new String[]{ID.toString()},null); int personID; String name; String phone; int amount; Person person = null; if(cursor.movetoFirst()){ personID = cursor.getInt(cursor.getColumnIndex("personID")); name = cursor.getString(cursor.getColumnIndex("name")); phone = cursor.getString(cursor.getColumnIndex("phone")); amount = cursor.getInt(cursor.getColumnIndex("amount")); person = new Person(personID,int maxResult){ sqliteDatabase sqldb = dbOperateHelper.getReadableDatabase(); //Cursor cursor = sqldb.rawquery("select * from person order by personID asc limit ?,String.valueOf(maxResult)}); //第一个参数是表名;第二个参数是查询显示的字段,null时默认查询显示所有字段; //第三个参数是where查询条件占位符;第四个是占位符对应的值; //第五个参数是group by条件;第六个是having条件;第七个是order by条件 //第八个参数是limit ?,? 条件 Cursor cursor = sqldb.query("person","personID",offset+","+maxResult); int personID; String name; String phone; int amount; Person person = null; List<Person> persons = new ArrayList<Person>(); while(cursor.movetoNext()){ personID = cursor.getInt(cursor.getColumnIndex("personID")); name = cursor.getString(cursor.getColumnIndex("name")); phone = cursor.getString(cursor.getColumnIndex("phone")); amount = cursor.getInt(cursor.getColumnIndex("amount")); person = new Person(personID,amount); persons.add(person); } cursor.close(); return persons; } /** * 返回总记录数 * @return */ public long getCount(){ sqliteDatabase sqldb = dbOperateHelper.getReadableDatabase(); //Cursor cursor = sqldb.rawquery("select count(*) from person",null); //第一个参数是表名;第二个参数是查询显示的字段,null时默认查询显示所有字段; //第三个参数是where查询条件占位符;第四个是占位符对应的值; //第五个参数是group by条件;第六个是having条件;第七个是order by条件 Cursor cursor = sqldb.query("person",new String[]{"count(*)"},null); //该查询语句值返回一条语句 cursor.movetoFirst(); long result = cursor.getLong(0); cursor.close(); return result; }}
十二、PersonServiceTest.java 单元测试类源码:
package com.example.test;import java.util.List;import com.example.domain.Person;import com.example.service.DBOperateHelper;import com.example.service.PersonService;import androID.test.AndroIDTestCase;import androID.util.Log;public class PersonServiceTest extends AndroIDTestCase { public voID testCreateDB() throws Exception{ DBOperateHelper dbHelper = new DBOperateHelper(getContext()); dbHelper.getWritableDatabase(); } public voID testSave() throws Exception{ PersonService ps = new PersonService(getContext()); for(int i=1;i<=100;i++){ Person person = new Person(); person.setname("我是"+i); person.setPhone(String.valueOf(Long.parseLong("18888888800")+i)); ps.save(person); Log.i("PersonService",person.toString()); } } public voID testDelete() throws Exception{ PersonService ps = new PersonService(getContext()); ps.delete(10); } public voID testUpdate() throws Exception{ PersonService ps = new PersonService(getContext()); ps.update(new Person(1,"xiaopang","18887654321",0)); } public voID testFind() throws Exception{ PersonService ps = new PersonService(getContext()); Person person = ps.find(1); Log.i("PersonService",person.toString()); } public voID testGetScrollData() throws Exception{ PersonService ps = new PersonService(getContext()); List<Person> persons = ps.getScrollData(3,5); for(Person person:persons){ Log.i("PersonService",person.toString()); } } public voID testGetCount() throws Exception{ PersonService ps = new PersonService(getContext()); Long count = ps.getCount(); Log.i("PersonService",count.toString()); } public voID testUpdateAmount() throws Exception{ PersonService ps = new PersonService(getContext()); Person person1 = ps.find(1); Person person2 = ps.find(2); person1.setAmount(100); person2.setAmount(100); ps.update(person1); ps.update(person2); } public voID testPayment() throws Exception{ PersonService ps = new PersonService(getContext()); ps.payment(); }}
十三、OtherPersonServiceTest 单元测试类源码:
package com.example.test;import java.util.List;import com.example.domain.Person;import com.example.service.DBOperateHelper;import com.example.service.OtherPersonService;import androID.test.AndroIDTestCase;import androID.util.Log;public class OtherPersonServiceTest extends AndroIDTestCase { public voID testCreateDB() throws Exception{ DBOperateHelper dbHelper = new DBOperateHelper(getContext()); dbHelper.getWritableDatabase(); } public voID testSave() throws Exception{ OtherPersonService ps = new OtherPersonService(getContext()); for(int i=1;i<=100;i++){ Person person = new Person(); person.setname("我是"+i); person.setPhone(String.valueOf(Long.parseLong("18888888800")+i)); ps.save(person); Log.i("PersonService",person.toString()); } } public voID testDelete() throws Exception{ OtherPersonService ps = new OtherPersonService(getContext()); ps.delete(10); } public voID testUpdate() throws Exception{ OtherPersonService ps = new OtherPersonService(getContext()); ps.update(new Person(1,0)); } public voID testFind() throws Exception{ OtherPersonService ps = new OtherPersonService(getContext()); Person person = ps.find(1); Log.i("PersonService",person.toString()); } public voID testGetScrollData() throws Exception{ OtherPersonService ps = new OtherPersonService(getContext()); List<Person> persons = ps.getScrollData(3,person.toString()); } } public voID testGetCount() throws Exception{ OtherPersonService ps = new OtherPersonService(getContext()); Long count = ps.getCount(); Log.i("PersonService",count.toString()); }}
十四、注意事项以及相关知识点:
1、掌握sqlite数据库如何创建数据库、建立表、维护字段等 *** 作
继承sqliteOpenHelper类,构造函数调用父类构造函数创建数据库,利用onCreate创建表,利用onUpgrade更新表字段信息
2、掌握sqlite数据库如何增、删、改、查以及分页
取得sqliteDatabase的实例,然后调用该实例的方法可以完成上述 *** 作
sqliteDataBase提供两种 *** 作上述功能的方式:一是直接调用execsql书写SQL语句,另一种是通过insert、update、delete、query等方法来传值来拼接sql,前一种适合熟练掌握sql 语句的
3、对需要数据同步的处理请添加事务处理,熟悉事务的处理方式
4、了解各个方法参数的意义以及传值
5、掌握ListVIEw显示后台数据的使用方法
SimpleAdapter、SimpleCursorAdapter以及自定义适配器的使用,以及OnItemClickListener取值时各个适配器返回值的区别以及取值方法
6、多学、多记、多练、多思,加油!
更多关于AndroID相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android通信方式总结》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》
希望本文所述对大家AndroID程序设计有所帮助。
您可能感兴趣的文章:android通过jxl读excel存入sqlite3数据库Android导入现有的数据库方法示例android实现raw文件夹导入数据库代码Android应用读取Excel文件的方法Android *** 作Excel文件的功能实现android读取assets中Excel表格并显示Android开发实现生成excel的方法详解Android开发实现读取excel数据并保存为xml的方法Android SQLite数据库增删改查 *** 作的使用详解Android使用SQLite数据库的简单实例Android开发实现的导出数据库到Excel表格功能【附源码下载】 总结以上是内存溢出为你收集整理的Android *** 作SQLite数据库(增、删、改、查、分页等)及ListView显示数据的方法详解全部内容,希望文章能够帮你解决Android *** 作SQLite数据库(增、删、改、查、分页等)及ListView显示数据的方法详解所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)