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>