android SQLiteDatabase详解

 

 

 

package com.example.database;

import android.os.Bundle;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity {
	private static final String TAG = "------->";
	private TextView showData;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		showData = (TextView)this.findViewById(R.id.showData);
		/*
		 * sdb.execSQL()不是任何sql语句都能执行,只能执行没有输出结果的sql语句,数据库的定义语言;
		 *数据操作部分:
		 * sdb.insert(String table, String nullColumnHack, ContentValues values); 
		 * sdb.update(String table, Contentvalues values, String whereClause, String whereArgs); 
		 * sdb.delete(String table, String whereClause, String whereArgs);
		 * 解释:insert中的第二个参数表示如果插入的数据每一列都为空的话,需要指定此行中某一列的名称,系统将此列设置为NULL,不至于出现错误;
		 * insert中的第三个参数是ContentValues类型的变量,是键值对组成的Map,key代表列名,value代表该列要插入的值;
		 * update的第二个参数也很类似,只不过它是更新该字段key为最新的value值,
		 * 第三个参数whereClause表示WHERE表达式,比如“age > ? and age < ?”等,
		 * 最后的whereArgs参数是占位符的实际参数值;delete方法的参数也是一样。 
		 */
		// 打开数据库,若不存在则创建数据
		SQLiteDatabase sdb = openOrCreateDatabase("test.db",Context.MODE_PRIVATE, null);
		
		// 通过sdb.execSQL(来执行sql语句,删除person表
		sdb.execSQL("drop table if exists person");
		
		// 通过.execSQL(String sql)创建person表
		sdb.execSQL("create table person(_id integer primary key autoincrement,name varchar(20),age smallint)");
		
		Person person = new Person();// Person是为数据库定义的一个字段类
		person.name = "john";
		person.age = 30;
		
		// 通过.execSQL(String sql,Object[] bindArgs)来插入数据,其中?是占位符,指定后面的内容,此方法更安全
		sdb.execSQL("INSERT INTO person VALUES (NULL, ?, ?)", new Object[] {person.name, person.age });
		person.name = "Jove";
		person.age = 24;
		
		// 通过ContentValues已键值对的方式存放数据,再对数据增改
		ContentValues contentValues = new ContentValues();
		contentValues.put("name", person.name);
		contentValues.put("age", person.age);

		sdb.insert("person", null, contentValues);// 增
		contentValues.put("age", 25);
		sdb.update("person", contentValues, "name=?", new String[] { "Jove" });// 改
		
		// 读取数据,rawQuery()的返回值是Cursor类型
		Cursor c = sdb.rawQuery("select * from person where age >=?",new String[] { "20" });
		while (c.moveToNext()) {//循环取Cursor中每一行的内容
			int _id = c.getInt(c.getColumnIndex("_id"));
			String name = c.getString(c.getColumnIndex("name"));
			int age = c.getInt(c.getColumnIndex("age"));
			String mes = "_id : " + _id + ",name : " + name + ",age" + age+"\n";
			Log.i(TAG, mes);
			showData.append(mes); //追加显示到一个TextView中

		}
		c.close();
		// 删除数据
		sdb.delete("person", "age <= ?", new String[] { "25" });
		// 关闭当前数据库
		sdb.close();
	}
	
/*
sdb.rawQuery(String sql, String[] selectionArgs);  
sdb.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy);  
sdb.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit);  
sdb.query(String distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit);  
查询操作相对于上面的几种操作要复杂些,因为我们经常要面对着各种各样的查询条件,所以系统也考虑到这种复杂性,为我们提供了较为丰富的查询形式,
上面几种都是常用的查询方法,第一种最为简单,将所有的SQL语句都组织到一个字符串中,使用占位符代替实际参数,selectionArgs就是占位符实际参数集;
下面的几种参数都很类似,columns表示要查询的列所有名称集,selection表示WHERE之后的条件语句,可以使用占位符,groupBy指定分组的列名,
having指定分组条件,配合groupBy使用,orderBy指定排序的列名,limit指定分页参数,distinct可以指定“true”或“false”表示要不要过滤重复值。
需要注意的是,selection、groupBy、having、orderBy、limit这几个参数中不包括“WHERE”、“GROUP BY”、“HAVING”、“ORDER BY”、“LIMIT”等SQL关键字。
*/

}


 

Person类也很简单,就是定义一些数据库表的字段:

package com.example.database;

public class Person {
	public int id;
	public String name;
	public int age;
	public String info;

	public Person(String name, int age, String info) {
		super();
		this.name = name;
		this.age = age;
		this.info = info;
	}

	public Person() {
		super();
	}
	

}


xml布局文件页很简单,就是简单一个TextView来显示获取的结果:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/showData"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</RelativeLayout>



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值