4、安卓数据存储——sqlite
朋友圈里的每一个消息体里面的数据,当下拉刷新从服务器下载数据包后,存入sqlite:用户名、图片url、点赞、评论等等。上拉加载的时候,从数据库里取出最近的5条数据加载到朋友圈上。
Android通过SQLite数据库引擎来实现结构化数据存储。SQLite是一个嵌入式数据库引擎,针对内存等资源有限的设备(如手机、PDA、MP3)提供的一种高效的数据库引擎。
SQLIte数据库不像其他数据库(如Oracle),它没有服务器进程。所有的内容包含在同一个单文件中。该文件是跨平台的,可以自由复制。基于其自身的先天优势,SQLite在嵌入式领域得到了广泛应用。Android也没有重复发明“轮子”,而是直接使用了SQLite数据库。
1、SQLiteDatabase
Android提供了创建和使用SQLite数据库的API。SQLiteDatabase代表一个数据库对象,提供了操作数据库的一些方法,另外还有一个SQLiteOpenHelper工具类提供了更简洁的功能。在Android的SDK目录下有个sqlite3工具,我们可以使用它来创建数据库、创建表和执行一些SQL语句。
SQLiteDatabase常用方法
| 方法名称 | 方法描述 | 
| 
 openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory)  | 
打开或创建数据库 | 
| insert(Sting table,String nullColumnHack,ContentValues values) | 添加一条记录 | 
| delete(String table,String whereClause,String[] whereArgs) | 删除一条记录 | 
| 
 query(String table,String[] columns,String selection,String[] selectionArgs, String groupBy,String having,String orderBy)  | 
查询记录 | 
| update(String table,ContentValues values,String whereClause,String[] whereArgs) | 修改记录 | 
| execSQL(String sql) | 执行一条SQL语句 | 
| close() | 关闭数据库 | 
1)、打开或者创建数据库
可以使用SQLiteDatabase的静态方法openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory)打开或创建一个数据库,该方法的第一个参数是数据库创建路径,注意这个路径一定是数据库全路径。例如:/data/data/package/database/dbname.db。第二个参数是指定返回一个Cursor子类的工厂,如果没有指定(null)则使用默认工厂。
- SQLiteDatabase.openOrCreateDatabase("/data/data/mx.android.ch09/database/temp.db", null);
 
- SQLiteDatabase.openOrCreateDatabase("/data/data/mx.android.ch09/database/temp.db", null);
 
2)、创建表
首先编写创建表的SQL语句,然后调用SQLiteDatabase的execSQL()方法。
- public void createTable(SQLiteDatabase db){
 - //创建SQL语句
 - String sql = "create table UserTbl(_id integer primary key autoincrement,username text,password text)";
 - //执行SQL语句
 - db.execSQL(sql);
 - }
 
- public void createTable(SQLiteDatabase db){
 - //创建SQL语句
 - String sql = "create table UserTbl(_id integer primary key autoincrement,username text,password text)";
 - //执行SQL语句
 - db.execSQL(sql);
 - }
 
3)、插入数据
有两种方法:一种是调用SQLiteDatabase的insert(String table,String nullColumnHack,ContentValues values)方法,该方法的第一个参数是表名称,第二个参数的空列的默认值,第三个参数是ContentValues类型的一个封装了列名称和列值的Map;另一种方法是编写插入数据的SQL语句、直接调用SQLiteDatabase的execSQL()方法来执行。
- public void insert1(SQLiteDatabase db){
 - String sql = "insert into UserTbl(username,password) values ('mx','123')";
 - db.execSQL(sql);
 - }
 
- public void insert1(SQLiteDatabase db){
 - String sql = "insert into UserTbl(username,password) values ('mx','123')";
 - db.execSQL(sql);
 - }
 
- public void insert2(SQLiteDatabase db){
 - //实例化常量值
 - ContentValues cv = new ContentValues();
 - cv.put("username","mx");
 - cv.put("password", "123");
 - db.insert("UserTbl",null, cv);
 - }
 
- public void insert2(SQLiteDatabase db){
 - //实例化常量值
 - ContentValues cv = new ContentValues();
 - cv.put("username","mx");
 - cv.put("password", "123");
 - db.insert("UserTbl",null, cv);
 - }
 
4)、删除数据
有两种方法:一种的调用SQLiteDatabase的delete(String table,String whereClause,String[] whereArgs)方法,该方法的第一个参数是表名称,第二个参数是删除条件,第三个参数的删除条件值数组;另一种方法是编写删除SQL语句,调用SQLiteDatabase的execSQL()方法来执行删除。
- public void delete1(SQLiteDatabase db){
 - String sql = "delete from UserTbl where _id = 1";
 - db.execSQL(sql);
 - }
 
- public void delete1(SQLiteDatabase db){
 - String sql = "delete from UserTbl where _id = 1";
 - db.execSQL(sql);
 - }
 
- public void delete2(SQLiteDatabase db){
 - String whereClause = "_id=?";
 - String[] whereArgs = {String.valueOf(1)};
 - db.delete("UserTbl", whereClause, whereArgs);
 - }
 
- public void delete2(SQLiteDatabase db){
 - String whereClause = "_id=?";
 - String[] whereArgs = {String.valueOf(1)};
 - db.delete("UserTbl", whereClause, whereArgs);
 - }
 
5)、查询数据
下面看一个查询方法。
- public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,
 - String groupBy,String having,String orderBy,String limit)。
 
- public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,
 - String groupBy,String having,String orderBy,String limit)。
 
各个参数的意义说明如下:
- table:表名称
 - columns:列名称数组
 - selection:条件子句,相当于where
 - selectionArgs:条件子句,参数数组
 - groupBy:分组列
 - having:分组条件
 - orderBy:排序列
 - limit:分页查询限制
 - Cursor:返回值,相当于结果集ResultSet
 
Cursor是一个游标接口,提供了遍历查询结果的方法,如移动指针方法move()、获得列值方法getString()等。
Cursor游标常用方法
| 方法名称 | 方法描述 | 
| getCount() | 总记录条数 | 
| isFirst() | 判断是否是第一条记录 | 
| isLast() | 判断是否是最后一条记录 | 
| moveToFirst() | 移动到第一条记录 | 
| moveToLast() | 移动到最后一条记录 | 
| move(int offset) | 移动到指定记录 | 
| moveToNext() | 移动到下一条记录 | 
| moveToPrevision() | 移动到上一条记录 | 
| getColumnIndexOrThrow(String columnName) | 根据列名获得列索引 | 
| getInt(int columnIndex) | 获得指定列索引的int类型值 | 
| getString(int columnIndex) | 获得指定列索引的String类型值 | 
下面代码演示了如何查询数据记录。
- public void query(SQLiteDatabase db){
 - //查询获得游标
 - Cursor c = db.query("UserTbl", null, null, null, null, null, null);
 - //判断游标是否为空
 - if(c.moveToFirst()){
 - //遍历游标
 - for (int i = 0; i < c.getCount(); i++) {
 - c.move(i);
 - //获得Id
 - int id = c.getInt(0);
 - //获得用户名
 - String username = c.getString(1);
 - //获得密码
 - String passwrod = c.getString(2);
 - //输出用户信息
 - System.out.println(id + ":" + username + ":" + passwrod);
 - }
 - }
 - }
 
- public void query(SQLiteDatabase db){
 - //查询获得游标
 - Cursor c = db.query("UserTbl", null, null, null, null, null, null);
 - //判断游标是否为空
 - if(c.moveToFirst()){
 - //遍历游标
 - for (int i = 0; i < c.getCount(); i++) {
 - c.move(i);
 - //获得Id
 - int id = c.getInt(0);
 - //获得用户名
 - String username = c.getString(1);
 - //获得密码
 - String passwrod = c.getString(2);
 - //输出用户信息
 - System.out.println(id + ":" + username + ":" + passwrod);
 - }
 - }
 - }
 
6)、修改数据
有两种方式:一种是调用SQLiteDatabase的update(String table,ContentValues values,String whereClause,String[] whereArgs)方法。该方法的第一个参数是表名称,第二个参数是更新列ContentValues类型的键-值对(Map),第三个参数是更新条件(where子句),第四个参数是更新条件的值数组。二是编写更新的SQL语句,调用SQLiteDatabase的execSQL执行更新。
- public void update1(SQLiteDatabase db){
 - String sql = "update UserTbl set password = 321 where _id = 1";
 - db.execSQL(sql);
 - }
 - public void update2(SQLiteDatabase db){
 - ContentValues values = new ContentValues();
 - values.put("password", "321");
 - String whereClause = "_id=?";
 - String[] whereArgs = {String.valueOf(1)};
 - db.update("UserTbl", values, whereClause, whereArgs);
 - }
 
- public void update1(SQLiteDatabase db){
 - String sql = "update UserTbl set password = 321 where _id = 1";
 - db.execSQL(sql);
 - }
 - public void update2(SQLiteDatabase db){
 - ContentValues values = new ContentValues();
 - values.put("password", "321");
 - String whereClause = "_id=?";
 - String[] whereArgs = {String.valueOf(1)};
 - db.update("UserTbl", values, whereClause, whereArgs);
 - }
 
2、SQLiteOpenHelper
SQLiteOpenHelper是SQLiteDatabase的一个帮助类,用来管理数据库的创建和版本更新。一般的用法是定义一个类继承之,并实现其两个抽线方法onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)来创建和更新数据库。
SQLiteOpenHelper常用方法
| 方法名称 | 方法描述 | 
| 
 SQLiteOpenHelper(Context context,String name, SQLiteDatabase.CursorFactory factory,int version)  | 
 构造方法,一般是传递一个要创建的 数据库名称name参数  | 
| onCreate(SQLiteDatabase db) | 创建数据库调用 | 
| 
 onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)  | 
版本更新调用 | 
| getReadableDatabase() | 创建或打开一个只读数据库 | 
| getWritableDatabase() | 创建或打开一个读写数据库 | 
下面的代码演示了通过继承SQLiteOpenHelper来实现创建数据库、创建表、插入数据和查询数据的过程。
- public class TestSQLiteActivity extends Activity {
 - @Override
 - protected void onCreate(Bundle savedInstanceState) {
 - super.onCreate(savedInstanceState);
 - setContentView(R.layout.sqlite);
 - //实例化数据库帮助类
 - MyDBHelper helper = new MyDBHelper(this);
 - //插入
 - helper.insert();
 - //查询
 - helper.query();
 - }
 - //数据库帮助类
 - class MyDBHelper extends SQLiteOpenHelper{
 - //创建SQL语句
 - private static final String CREATE_TABLE_SQL = "create table TempTb1(_id integer,name text)";
 - //SQLiteDatabase实例
 - private SQLiteDatabase db;
 - //构造方法
 - public MyDBHelper(Context c) {
 - super(c, "test.db", null, 2);
 - }
 - @Override
 - public void onCreate(SQLiteDatabase db) {
 - //创建表
 - db.execSQL(CREATE_TABLE_SQL);
 - }
 - @Override
 - public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
 - }
 - //插入方法
 - private void insert(){
 - //插入SQL语句
 - String sql = "insert into TempTb1(_id,name) values(1,'mx')";
 - //执行插入
 - getWritableDatabase().execSQL(sql);
 - }
 - //查询方法
 - private void query(){
 - //获得查询游标
 - Cursor c = getWritableDatabase().query("TempTb1", null, null, null, null, null, null);
 - //判断游标是否为空
 - if(c.moveToFirst()){
 - //遍历游标
 - for (int i = 0; i < c.getCount(); i++) {
 - c.move(i);
 - int id = c.getInt(0);
 - String name = c.getString(1);
 - System.out.println(id + ":" + name);
 - }
 - }
 - }
 - }
 - }
 
- public class TestSQLiteActivity extends Activity {
 - @Override
 - protected void onCreate(Bundle savedInstanceState) {
 - super.onCreate(savedInstanceState);
 - setContentView(R.layout.sqlite);
 - //实例化数据库帮助类
 - MyDBHelper helper = new MyDBHelper(this);
 - //插入
 - helper.insert();
 - //查询
 - helper.query();
 - }
 - //数据库帮助类
 - class MyDBHelper extends SQLiteOpenHelper{
 - //创建SQL语句
 - private static final String CREATE_TABLE_SQL = "create table TempTb1(_id integer,name text)";
 - //SQLiteDatabase实例
 - private SQLiteDatabase db;
 - //构造方法
 - public MyDBHelper(Context c) {
 - super(c, "test.db", null, 2);
 - }
 - @Override
 - public void onCreate(SQLiteDatabase db) {
 - //创建表
 - db.execSQL(CREATE_TABLE_SQL);
 - }
 - @Override
 - public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
 - }
 - //插入方法
 - private void insert(){
 - //插入SQL语句
 - String sql = "insert into TempTb1(_id,name) values(1,'mx')";
 - //执行插入
 - getWritableDatabase().execSQL(sql);
 - }
 - //查询方法
 - private void query(){
 - //获得查询游标
 - Cursor c = getWritableDatabase().query("TempTb1", null, null, null, null, null, null);
 - //判断游标是否为空
 - if(c.moveToFirst()){
 - //遍历游标
 - for (int i = 0; i < c.getCount(); i++) {
 - c.move(i);
 - int id = c.getInt(0);
 - String name = c.getString(1);
 - System.out.println(id + ":" + name);
 - }
 - }
 - }
 - }
 - }
 
3、SQLite应用实例——收藏管理
通过使用SQLite对自己比较喜欢的网站进行收藏管理。收藏信息包括编号、网站名称、URL和网站内容描述,可以实现的功能有添加、删除和浏览等。
1)、创建操作数据库的工具类DBHelper,该类继承SQLiteOpenHelper。覆盖onCreate()和onUpgrade()方法,并添加inisert()、del()、query()方法,分别用来添加、删除和查询数据。
- public class DBHelper extends SQLiteOpenHelper {
 - //数据库名称
 - private static final String DB_NAME = "coll.db";
 - //表名称
 - private static final String TBL_NAME = "CollTbl";
 - //创建表SQL语句
 - private static final String CREATE_TBL = "create table CollTbl(_id integer primary key " +
 - "autoincrement,name text,url text,desc text)";
 - //SQLiteDatabase实例
 - private SQLiteDatabase db;
 - //构造方法
 - public DBHelper(Context c) {
 - super(c, DB_NAME, null, 2);
 - }
 - //创建表
 - @Override
 - public void onCreate(SQLiteDatabase db) {
 - this.db = db;
 - db.execSQL(CREATE_TBL);
 - }
 - //插入方法
 - public void insert(ContentValues values){
 - //获得SQLiteDatabase实例
 - SQLiteDatabase db = getWritableDatabase();
 - //插入
 - db.insert(TBL_NAME, null, values);
 - db.close();
 - }
 - //查询方法
 - public Cursor query(){
 - //获得SQLiteDatabase实例
 - SQLiteDatabase db = getWritableDatabase();
 - //查询获得Cursor
 - Cursor c = db.query(TBL_NAME, null, null, null, null, null, null);
 - return c;
 - }
 - //删除方法
 - public void delete(int id){
 - if(db == null)
 - db = getWritableDatabase();
 - db.delete(TBL_NAME, "_id=?", new String[]{String.valueOf(id)});
 - }
 - //关闭数据库
 - public void close(){
 - if(db != null)
 - db.close();
 - }
 - @Override
 - public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
 - }
 - }
 
- public class DBHelper extends SQLiteOpenHelper {
 - //数据库名称
 - private static final String DB_NAME = "coll.db";
 - //表名称
 - private static final String TBL_NAME = "CollTbl";
 - //创建表SQL语句
 - private static final String CREATE_TBL = "create table CollTbl(_id integer primary key " +
 - "autoincrement,name text,url text,desc text)";
 - //SQLiteDatabase实例
 - private SQLiteDatabase db;
 - //构造方法
 - public DBHelper(Context c) {
 - super(c, DB_NAME, null, 2);
 - }
 - //创建表
 - @Override
 - public void onCreate(SQLiteDatabase db) {
 - this.db = db;
 - db.execSQL(CREATE_TBL);
 - }
 - //插入方法
 - public void insert(ContentValues values){
 - //获得SQLiteDatabase实例
 - SQLiteDatabase db = getWritableDatabase();
 - //插入
 - db.insert(TBL_NAME, null, values);
 - db.close();
 - }
 - //查询方法
 - public Cursor query(){
 - //获得SQLiteDatabase实例
 - SQLiteDatabase db = getWritableDatabase();
 - //查询获得Cursor
 - Cursor c = db.query(TBL_NAME, null, null, null, null, null, null);
 - return c;
 - }
 - //删除方法
 - public void delete(int id){
 - if(db == null)
 - db = getWritableDatabase();
 - db.delete(TBL_NAME, "_id=?", new String[]{String.valueOf(id)});
 - }
 - //关闭数据库
 - public void close(){
 - if(db != null)
 - db.close();
 - }
 - @Override
 - public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
 - }
 - }
 
2)、创建视图布局文件add.xml,在其中添加三个TextView和三个EditText,分别用来输入网站名称、URL和网站描述信息,一个Button响应单击事件,当用户单击时将信息保存到数据库中。
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 - android:layout_width="fill_parent" android:layout_height="fill_parent"
 - android:orientation="vertical" android:layout_gravity="center_vertical" >
 - <TextView
 - android:text="网站名称"
 - android:id="@+id/s_TextView01"
 - android:layout_width="wrap_content"
 - android:layout_height="wrap_content" />
 - <EditText
 - android:text=""
 - android:id="@+id/s_EditTextName"
 - android:layout_width="fill_parent"
 - android:layout_height="wrap_content" />
 - <TextView
 - android:text="URL"
 - android:id="@+id/s_TextView02"
 - android:layout_width="wrap_content"
 - android:layout_height="wrap_content" />
 - <EditText
 - android:text=""
 - android:id="@+id/s_EditTextURL"
 - android:layout_width="fill_parent"
 - android:layout_height="wrap_content" />
 - <TextView
 - android:text="网站描述"
 - android:id="@+id/s_TextView03"
 - android:layout_width="wrap_content"
 - android:layout_height="wrap_content" />
 - <EditText
 - android:text=""
 - android:id="@+id/s_EditTextDesc"
 - android:layout_width="fill_parent"
 - android:layout_height="wrap_content" />
 - <Button
 - android:text="添加"
 - android:id="@+id/s_ButtonAdd"
 - android:layout_width="wrap_content"
 - android:layout_height="wrap_content" />
 - </LinearLayout>
 
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 - android:layout_width="fill_parent" android:layout_height="fill_parent"
 - android:orientation="vertical" android:layout_gravity="center_vertical" >
 - <TextView
 - android:text="网站名称"
 - android:id="@+id/s_TextView01"
 - android:layout_width="wrap_content"
 - android:layout_height="wrap_content" />
 - <EditText
 - android:text=""
 - android:id="@+id/s_EditTextName"
 - android:layout_width="fill_parent"
 - android:layout_height="wrap_content" />
 - <TextView
 - android:text="URL"
 - android:id="@+id/s_TextView02"
 - android:layout_width="wrap_content"
 - android:layout_height="wrap_content" />
 - <EditText
 - android:text=""
 - android:id="@+id/s_EditTextURL"
 - android:layout_width="fill_parent"
 - android:layout_height="wrap_content" />
 - <TextView
 - android:text="网站描述"
 - android:id="@+id/s_TextView03"
 - android:layout_width="wrap_content"
 - android:layout_height="wrap_content" />
 - <EditText
 - android:text=""
 - android:id="@+id/s_EditTextDesc"
 - android:layout_width="fill_parent"
 - android:layout_height="wrap_content" />
 - <Button
 - android:text="添加"
 - android:id="@+id/s_ButtonAdd"
 - android:layout_width="wrap_content"
 - android:layout_height="wrap_content" />
 - </LinearLayout>
 
3)、创建AddActivity,声明用到的组件类EditText和Button,在onCreate()方法中进行初始化,响应Button的单击事件方法,该方法从编辑框中获得数据项,封装到ContentValues对象中,调用DBHelper进行保存,之后跳转到显示收藏记录QueryActivity界面。
- public class AddActivity extends Activity {
 - //声明EditText实例
 - private EditText et1,et2,et3;
 - //声明Button实例
 - private Button b1;
 - @Override
 - protected void onCreate(Bundle savedInstanceState) {
 - super.onCreate(savedInstanceState);
 - setContentView(R.layout.add);
 - this.setTitle("添加收藏信息");
 - et1 = (EditText) findViewById(R.id.s_EditTextName);
 - et2 = (EditText) findViewById(R.id.s_EditTextURL);
 - et3 = (EditText) findViewById(R.id.s_EditTextDesc);
 - b1 = (Button) findViewById(R.id.s_ButtonAdd);
 - b1.setOnClickListener(new OnClickListener() {
 - @Override
 - public void onClick(View arg0) {
 - String name = et1.getText().toString();
 - String url = et2.getText().toString();
 - String desc = et3.getText().toString();
 - //内容值实例
 - ContentValues values = new ContentValues();
 - values.put("name", name);
 - values.put("url", url);
 - values.put("desc", desc);
 - //实例化数据库帮助类
 - DBHelper helper = new DBHelper(getApplicationContext());
 - //插入数据
 - helper.insert(values);
 - //实例化Intent
 - Intent intent = new Intent(AddActivity.this,QueryActivity.class);
 - startActivity(intent);
 - }
 - });
 - }
 - }
 
- public class AddActivity extends Activity {
 - //声明EditText实例
 - private EditText et1,et2,et3;
 - //声明Button实例
 - private Button b1;
 - @Override
 - protected void onCreate(Bundle savedInstanceState) {
 - super.onCreate(savedInstanceState);
 - setContentView(R.layout.add);
 - this.setTitle("添加收藏信息");
 - et1 = (EditText) findViewById(R.id.s_EditTextName);
 - et2 = (EditText) findViewById(R.id.s_EditTextURL);
 - et3 = (EditText) findViewById(R.id.s_EditTextDesc);
 - b1 = (Button) findViewById(R.id.s_ButtonAdd);
 - b1.setOnClickListener(new OnClickListener() {
 - @Override
 - public void onClick(View arg0) {
 - String name = et1.getText().toString();
 - String url = et2.getText().toString();
 - String desc = et3.getText().toString();
 - //内容值实例
 - ContentValues values = new ContentValues();
 - values.put("name", name);
 - values.put("url", url);
 - values.put("desc", desc);
 - //实例化数据库帮助类
 - DBHelper helper = new DBHelper(getApplicationContext());
 - //插入数据
 - helper.insert(values);
 - //实例化Intent
 - Intent intent = new Intent(AddActivity.this,QueryActivity.class);
 - startActivity(intent);
 - }
 - });
 - }
 - }
 
4)、创建显示记录QueryActivity。该类继承ListActivity,将从数据库查询的记录通过ListView显示在列表中。并且当用户点击某条记录时,通过对话框提示用户是否删除此记录。
row.xml
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 - android:layout_width="fill_parent" android:layout_height="fill_parent"
 - android:orientation="horizontal" android:layout_gravity="center_vertical" >
 - <TextView
 - android:id="@+id/r_text0"
 - android:layout_width="wrap_content"
 - android:layout_height="wrap_content"
 - android:paddingRight="10px" />
 - <TextView
 - android:id="@+id/r_text1"
 - android:layout_width="wrap_content"
 - android:layout_height="wrap_content"
 - android:paddingRight="10px" />
 - <TextView
 - android:id="@+id/r_text2"
 - android:layout_width="wrap_content"
 - android:layout_height="wrap_content"
 - android:paddingRight="10px" />
 - <TextView
 - android:id="@+id/r_text3"
 - android:layout_width="wrap_content"
 - android:layout_height="wrap_content"
 - android:paddingLeft="10px" />
 - </LinearLayout>
 
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 - android:layout_width="fill_parent" android:layout_height="fill_parent"
 - android:orientation="horizontal" android:layout_gravity="center_vertical" >
 - <TextView
 - android:id="@+id/r_text0"
 - android:layout_width="wrap_content"
 - android:layout_height="wrap_content"
 - android:paddingRight="10px" />
 - <TextView
 - android:id="@+id/r_text1"
 - android:layout_width="wrap_content"
 - android:layout_height="wrap_content"
 - android:paddingRight="10px" />
 - <TextView
 - android:id="@+id/r_text2"
 - android:layout_width="wrap_content"
 - android:layout_height="wrap_content"
 - android:paddingRight="10px" />
 - <TextView
 - android:id="@+id/r_text3"
 - android:layout_width="wrap_content"
 - android:layout_height="wrap_content"
 - android:paddingLeft="10px" />
 - </LinearLayout>
 
- public class QueryActivity extends ListActivity {
 - @Override
 - protected void onCreate(Bundle savedInstanceState) {
 - super.onCreate(savedInstanceState);
 - setContentView(R.layout.row);
 - this.setTitle("浏览收藏信息");
 - //实例化数据库帮助类
 - final DBHelper helper = new DBHelper(this);
 - //查询获得游标
 - Cursor c = helper.query();
 - //列表项数组
 - String[] from = {"_id","name","url","desc"};
 - //列表项ID
 - int[] to = {R.id.r_text0,R.id.r_text1,R.id.r_text2,R.id.r_text3};
 - //适配器
 - SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,R.layout.row,c,from,to);
 - //列表视图
 - ListView listView = getListView();
 - //为列表视图添加适配器
 - listView.setAdapter(adapter);
 - //提示对话框
 - final AlertDialog.Builder builder = new AlertDialog.Builder(this);
 - //为ListView设置单击监听器
 - listView.setOnItemClickListener(new OnItemClickListener() {
 - @Override
 - public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
 - long arg3) {
 - final long temp = arg3;
 - builder.setMessage("真的要删除该记录吗?").setPositiveButton("是", new DialogInterface.OnClickListener() {
 - @Override
 - public void onClick(DialogInterface dialog, int which) {
 - //删除数据
 - helper.delete((int)temp);
 - //重新查询
 - Cursor c = helper.query();
 - String[] from = {"_id","name","url","desc"};
 - int[] to = {R.id.r_text0,R.id.r_text1,R.id.r_text2,R.id.r_text3};
 - SimpleCursorAdapter adapter = newSimpleCursorAdapter(getApplicationContext(),R.layout.row,c,from,to);
 - ListView listView = getListView();
 - listView.setAdapter(adapter);
 - }
 - }).setNegativeButton("否", new DialogInterface.OnClickListener() {
 - @Override
 - public void onClick(DialogInterface dialog, int which) {
 - }
 - });
 - //创建提示对话框
 - AlertDialog ad = builder.create();
 - ad.show();
 - }
 - });
 
- helper.close();
 
- }
 
- }
 
- 原帖地址:
 
4、安卓数据存储——sqlite的更多相关文章
- 安卓数据存储(3):SQLite数据库存储
		
SQLite简介 Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大.SQLite具备下列特点: 1.轻量级:使用 SQLit ...
 - 1、安卓数据存储机制——sharedPreference
		
项目中用到的数据存储方式: 1.这个项目里的“个人标签“.”个性签名“页面的文字存储——sharedPreference:我们项目中用到的Preference来保存用户编辑的标签.签名内容,并支持用户 ...
 - 安卓数据存储(2):SharedPreferences
		
SharedPreferences是Android中最容易理解的数据存储技术,实际上SharedPreferences处理的就是一个key-value(键值对)在读取数据时可以通过这个键把相应的值取出 ...
 - Unity本地数据存储---Sqlite和JSON
		
2014-05-04更新 SqliteDatabase.cs这个文件的初始方法有问题,具体是如果指定URL已经存在了DB文件,就不会重新覆盖DB文件. 这导致我们修改之后的DB文件无法产生效果. 本人 ...
 - 数据存储--sqlite总结
		
SQLite SQLite(轻量级的数据库,关系型数据库) 辅助工具:Navicat Premium 等 原理:ios针对存储问题封装了sqlite数据库(c语言数据库). 1 app获取沙盒地址命名 ...
 - Android数据存储——SQLite数据库(模板)
		
本篇整合Android使用数据库,要保存一个实体类的样本. 首先看一下数据库语句: ORM:关系对象映射 添加数据: ContentValues values = new ContentValues( ...
 - Android笔记(四十四) Android中的数据存储——SQLite(六)整合
		
实现注册.登录.注销账户 MainActivity.java package cn.lixyz.activity; import android.app.Activity; import androi ...
 - Android笔记(四十三) Android中的数据存储——SQLite(五)delete
		
SQLite通过delete()方法删除数据 delete()方法参数说明: delete()方法参数 对应sql部分 描述 table delte from table_name 要删除的表 whe ...
 - Android笔记(四十二) Android中的数据存储——SQLite(四)update
		
update方法的四个参数: update()方法参数 对应的sql部分 描述 table update table_name 更新的表名 values set column=xxx ContentV ...
 
随机推荐
- 用phpstudy搭建dedecms网站验证码出不来解决方案
			
验证码图片不显示,这应该是很多站长朋友们最长遇到的一个问题,本地测试明明好好的,为什么传上空间或者服务器上验证码就无法显示了呢,春哥分析这可能是由于没有加载gd库扩展所引起的,那么怎么解决呢?由于引起 ...
 - boost之词法解析器spirit
			
摘要:解析器就是编译原理中的语言的词法分析器,可以按照文法规则提取字符或者单词.功能:接受扫描器的输入,并根据语法规则对输入流进行匹配,匹配成功后执行语义动作,进行输入数据的处理. C++ 程序员需要 ...
 - Linux 部署 Tomcat和JDK
			
一:安装jdk下载将jdk加压后放到/usr/local目录下: [root@master ~]#chmod 755 jdk-6u5-linux-x64.bin [root@master ~]# ./ ...
 - Android 下得到 未安装APK包含信息   等
			
很多情况下,我们需要通过APK文件来得到它的一些信息. (此时此APK不一定被安装了) 0. 基础知识:可以通过android.content.Context的方法 getPackageManager ...
 - cakephp 的query方法,直接写在controller中是否 有点不合适
			
模型的query()函数有时是非常实用的,它可以在任何需要数据的地方执行SQL语句.但不是在什么地方调用query()方法都是恰当的.特别是在控制器中直接调用模型的query()方法 $this-&g ...
 - JAVA List<T> 如何初始化
			
通常用法:List<类型> list=new ArrayList<类型>();List是一个接口,不可实例化,通过实例化其实现类来使用List集合,他的最常用实现类ArrayL ...
 - conflicting types for xxxx错误 (转)
			
pretty_print.c:31: error: conflicting types for ‘vmi_print_hex’ libvmi.h:749: note: previous declara ...
 - (转)MultipleOutputFormat和MultipleOutputs
			
MultipleOutputFormat和MultipleOutputs http://www.cnblogs.com/liangzh/archive/2012/05/22/2512264.html ...
 - 关于源码编译每次提示有错误 要make update-api
			
最近编译newline的版本的时候..同事修改了andoid默认输入法为百度.这是系统自动提供的API,所以每次编译会提示 此时在编译源码生成SDK的过程中会出现这个问题:************** ...
 - FIR滤波器的实现方法(转)
			
源:http://blog.sina.com.cn/s/blog_493520900102uy26.html 内容来自于上篇博文,第七章,FIR滤波器 http://blog.sina.com.cn/ ...