MainActivity如下:
package cc.testdb; import java.util.List; import cc.database.DBUtils; import cc.domain.Person; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.view.WindowManager; import android.widget.Button; import android.app.Activity; import android.content.Context; /** * Demo描述: * SQLite数据操作 * * 参考资料: * http://blog.csdn.net/lfdfhl/article/details/8195378 * */ public class MainActivity extends Activity { private Button mAddButton; private Button mQueryButton; private Button mUpdateButton; private Button mDeleteButton; private Button mCountButton; private Button mPageButton; private Button mTransactionButton; private Context mContext; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.main); init(); } private void init(){ mContext=this; mAddButton=(Button) findViewById(R.id.addButton); mAddButton.setOnClickListener(new ClickListenerImpl()); mQueryButton=(Button) findViewById(R.id.queryButton); mQueryButton.setOnClickListener(new ClickListenerImpl()); mUpdateButton=(Button) findViewById(R.id.updateButton); mUpdateButton.setOnClickListener(new ClickListenerImpl()); mDeleteButton=(Button) findViewById(R.id.deleteButton); mDeleteButton.setOnClickListener(new ClickListenerImpl()); mCountButton=(Button) findViewById(R.id.countButton); mCountButton.setOnClickListener(new ClickListenerImpl()); mPageButton=(Button) findViewById(R.id.pageButton); mPageButton.setOnClickListener(new ClickListenerImpl()); mTransactionButton=(Button) findViewById(R.id.transactionButton); mTransactionButton.setOnClickListener(new ClickListenerImpl()); } private class ClickListenerImpl implements OnClickListener { Person person=null; @Override public void onClick(View v) { switch (v.getId()) { case R.id.addButton: for (int i = 0; i < 15; i++) { person=new Person("xiaoming"+i, "9527"+i); DBUtils.add(mContext,person); } break; case R.id.queryButton: person=DBUtils.query(mContext,5); System.out.println(person); break; case R.id.updateButton: person=DBUtils.query(mContext,1); System.out.println("修改前:"+person); person=new Person(1, "xx", "1234"); DBUtils.update(mContext,person); person=DBUtils.query(mContext,1); System.out.println("修改后:"+person); break; case R.id.deleteButton: DBUtils.delete(mContext,2); break; case R.id.countButton: int count=DBUtils.count(mContext); System.out.println("数据总量为:"+count); break; case R.id.pageButton: List<Person> list=DBUtils.page(mContext,4, 9); for (int i = 0; i < list.size(); i++) { person=list.get(i); System.out.println("分页的数据:"+person); } break; case R.id.transactionButton: person=new Person(1, "ccc", "8888"); DBUtils.transaction(mContext,person); person=DBUtils.query(mContext,1); System.out.println("事务操作后:"+person); break; default: break; } } } }
DataBaseOpenHelper如下:
package cc.database; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class DataBaseOpenHelper extends SQLiteOpenHelper { private final static String DATABASE_NAME="test.db"; private static DataBaseOpenHelper mDataBaseOpenHelper; //super(context, DATABASE_NAME, null, 1)方法: //若不存在DATABASE_NAME数据,则执行onCreate(SQLiteDatabase db)方法 //若已经存在则不再新建数据库 //方法中第三个参数为:version 版本号 //当version变大时会自动调用 //onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)方法 public DataBaseOpenHelper(Context context) { super(context, DATABASE_NAME, null, 1); } //注意: //将DataBaseOpenHelper写成单例的. //否则当在一个for循环中频繁调用openHelper.getWritableDatabase()时 //会报错,提示数据库没有执行关闭操作 static synchronized DataBaseOpenHelper getDBInstance(Context context) { if (mDataBaseOpenHelper == null) { mDataBaseOpenHelper = new DataBaseOpenHelper(context); } return mDataBaseOpenHelper; } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("create table person(personid integer primary key autoincrement,name varchar(20),phone VARCHAR(12))"); } //为person增加一个address字段,默认值为null @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("ALTER TABLE person ADD address VARCHAR(12) NULL"); } }
DBUtils如下:
package cc.database; import java.util.ArrayList; import java.util.List; import cc.domain.Person; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; public class DBUtils { public static DataBaseOpenHelper openHelper; public static SQLiteDatabase db; public static void add(Context context,Person person){ openHelper=DataBaseOpenHelper.getDBInstance(context); db=openHelper.getWritableDatabase(); db.execSQL("insert into person (name,phone) values(?,?)", new Object[]{person.getName(),person.getPhone()}); } //注意: // 1 rawQuery()方法查询后返回的结果是一个Cursor类的对象 // 2 最后要关闭cursor即cursor.close(); public static Person query(Context context,int id){ openHelper=DataBaseOpenHelper.getDBInstance(context); db=openHelper.getWritableDatabase(); Cursor cursor=db.rawQuery("select * from person where personid=?", new String[]{String.valueOf(id)}); while(cursor.moveToFirst()){ int personid=cursor.getInt(cursor.getColumnIndex("personid")); String name=cursor.getString(cursor.getColumnIndex("name")); String phone=cursor.getString(cursor.getColumnIndex("phone")); return new Person(personid, name, phone); } cursor.close(); return null; } //因为name和phone的类型都是String,但是id是整型的 //所以这里的数组写成了Object类型的 public static void update(Context context,Person person){ openHelper=DataBaseOpenHelper.getDBInstance(context); db=openHelper.getWritableDatabase(); db.execSQL("update person set name=?,phone=? where personid=?", new Object[]{person.getName(),person.getPhone(),person.getId()}); } public static void delete(Context context,int id){ openHelper=DataBaseOpenHelper.getDBInstance(context); db=openHelper.getWritableDatabase(); db.execSQL("delete from person where personid=?",new Object[]{String.valueOf(id)}); } //在while循环里要注意终止循环,否则是个死循环 //因为如果cursor不为空那么 //cursor.moveToFirst()总是返回true public static int count(Context context){ openHelper=DataBaseOpenHelper.getDBInstance(context); db=openHelper.getReadableDatabase(); Cursor cursor=db.rawQuery("select count(*) from person", null); int i=0; while(cursor.moveToFirst()){ i=cursor.getInt(0); break; } return i; } public static List<Person> page(Context context,int offset,int resuletNumber){ openHelper=DataBaseOpenHelper.getDBInstance(context); db=openHelper.getWritableDatabase(); ArrayList<Person> persons=new ArrayList<Person>(); Person person=null; Cursor cursor=db.rawQuery("select * from person limit ?,?", new String []{String.valueOf(offset),String.valueOf(resuletNumber)}); while(cursor.moveToNext()){ int personid=cursor.getInt(cursor.getColumnIndex("personid")); String name=cursor.getString(cursor.getColumnIndex("name")); String phone=cursor.getString(cursor.getColumnIndex("phone")); person=new Person(personid, name, phone); persons.add(person); } return persons; } /** * 结束事务有两种:提交事务和回滚事务. * 默认情况是回滚事务!!!! * 事务是否提交是由事务的标志来决定: * 如果事务的标志位失败(false),就回滚事务;否则(true)提交事务。 * 所以默认情况下事务的标志为失败(false)即回滚事务. */ public static void transaction(Context context,Person person){ openHelper=DataBaseOpenHelper.getDBInstance(context); db = openHelper.getWritableDatabase(); //开启事务 db.beginTransaction(); try{ db.execSQL("update person set name=? where personid=?", new Object[]{person.getName(),person.getId()}); db.execSQL("update person set phone=? where personid=?", new Object[]{person.getPhone(),person.getId()}); //设置事务的标志为成功 db.setTransactionSuccessful(); }finally{ //结束事务,默认情况下是回滚事务 db.endTransaction(); } } }
修改后的DBUtils
package cc.database; import java.util.ArrayList; import java.util.List; import cc.domain.Person; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; /** * 在原来基础上修改后的DBUtils * * 主要的修改: * 原来采用了原生的SQL语句进行增删改查 * 现在改为利用Android自带的方法: * insert(String table, String nullColumnHack, ContentValues values) * delete(String table, String whereClause, String[] whereArgs) * update(String table, ContentValues values, String whereClause, String[] whereArgs) * query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit) * 来实现 * 2014年12月14日16:53:08 */ public class DBUtils { public final static String TABLE_NAME="person"; public static DataBaseOpenHelper openHelper; public static SQLiteDatabase db; /** * * 利用SQLiteDatabase.insert(String table, String nullColumnHack, ContentValues values)方法插入数据 * 注意该方法的第二个参数: * 用于在未指定添加数据的情况下给某些可为空的列自动赋值为NULL.一般情况下不会这么做,所以传入NULL即可. * * 该操作等同于: * db.execSQL("insert into person (name,phone) values(?,?)",new Object[]{person.getName(),person.getPhone()}); */ public static void insertData(Context context,Person person){ openHelper=DataBaseOpenHelper.getDBInstance(context); db=openHelper.getWritableDatabase(); ContentValues contentValues=new ContentValues(); contentValues.put("name", person.getName()); contentValues.put("phone", person.getPhone()); db.insert(TABLE_NAME, null, contentValues); } /** * 利用SQLiteDatabase.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit) * 方法查询数据 * * 该操作等同于: * Cursor cursor=db.rawQuery("select * from person where personid=?", new String[]{String.valueOf(id)}); * 注意: * 1 rawQuery()方法查询后返回的结果是一个Cursor类的对象 * 2 最后要关闭cursor即cursor.close(); */ public static Person queryData(Context context,int id){ openHelper=DataBaseOpenHelper.getDBInstance(context); db=openHelper.getWritableDatabase(); Cursor cursor=db.query(TABLE_NAME, null, "personid=?",new String []{id+""}, null, null, null, null); while(cursor.moveToFirst()){ int personid=cursor.getInt(cursor.getColumnIndex("personid")); String name=cursor.getString(cursor.getColumnIndex("name")); String phone=cursor.getString(cursor.getColumnIndex("phone")); return new Person(personid, name, phone); } cursor.close(); return null; } /** * 利用SQLiteDatabase.update(String table, ContentValues values, String whereClause, String[] whereArgs) * 更新数据. * 第二个参数表示要更新的内容 * 第三和第四个参数表示了要更新的列及其对应的值 * 注意第三个参数中占位符的使用 * * 该操作等同于: * db.execSQL("update person set name=?,phone=? where personid=?", * new Object[]{person.getName(),person.getPhone(),person.getId()}); * 因为name和phone的类型都是String,但是id是整型的 * 所以这里的数组写成了Object类型的 */ public static void updateData(Context context,Person person){ openHelper=DataBaseOpenHelper.getDBInstance(context); db=openHelper.getWritableDatabase(); ContentValues contentValues=new ContentValues(); contentValues.put("name", person.getName()); contentValues.put("phone", person.getPhone()); db.update(TABLE_NAME, contentValues, "personid=?", new String []{person.getId()+""}); } /** * 利用SQLiteDatabase.delete(String table, String whereClause, String[] whereArgs) * 删除数据 * * 该操作等同于: * db.execSQL("delete from person where personid=?",new Object[]{String.valueOf(id)}); */ public static void delete(Context context,int id){ openHelper=DataBaseOpenHelper.getDBInstance(context); db=openHelper.getWritableDatabase(); db.delete(TABLE_NAME, "personid=?", new String []{id+""}); } //在while循环里要注意终止循环,否则是个死循环 //因为如果cursor不为空那么 //cursor.moveToFirst()总是返回true public static int count(Context context){ openHelper=DataBaseOpenHelper.getDBInstance(context); db=openHelper.getReadableDatabase(); Cursor cursor=db.rawQuery("select count(*) from person", null); int i=0; while(cursor.moveToFirst()){ i=cursor.getInt(0); break; } return i; } public static List<Person> page(Context context,int offset,int resuletNumber){ openHelper=DataBaseOpenHelper.getDBInstance(context); db=openHelper.getWritableDatabase(); ArrayList<Person> persons=new ArrayList<Person>(); Person person=null; Cursor cursor=db.rawQuery("select * from person limit ?,?", new String []{String.valueOf(offset),String.valueOf(resuletNumber)}); while(cursor.moveToNext()){ int personid=cursor.getInt(cursor.getColumnIndex("personid")); String name=cursor.getString(cursor.getColumnIndex("name")); String phone=cursor.getString(cursor.getColumnIndex("phone")); person=new Person(personid, name, phone); persons.add(person); } return persons; } /** * 结束事务有两种:提交事务和回滚事务. * 默认情况是回滚事务!!!! * 事务是否提交是由事务的标志来决定: * 如果事务的标志位失败(false),就回滚事务;否则(true)提交事务。 * 所以默认情况下事务的标志为失败(false)即回滚事务. */ public static void transaction(Context context,Person person){ openHelper=DataBaseOpenHelper.getDBInstance(context); db = openHelper.getWritableDatabase(); //开启事务 db.beginTransaction(); try{ db.execSQL("update person set name=? where personid=?", new Object[]{person.getName(),person.getId()}); db.execSQL("update person set phone=? where personid=?", new Object[]{person.getPhone(),person.getId()}); //设置事务的标志为成功 db.setTransactionSuccessful(); }finally{ //结束事务,默认情况下是回滚事务 db.endTransaction(); } } }
Person如下:
package cc.domain; public class Person { private Integer id; private String name; private String phone; public Person(String name, String phone) { this.name = name; this.phone = phone; } public Person(Integer id, String name, String phone) { this.id = id; this.name = name; this.phone = phone; } 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; } @Override public String toString() { return "Person [id=" + id + ", name=" + name + ", phone=" + phone + "]"; } }
main.xml如下:
<LinearLayout 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:paddingLeft="20dip" android:paddingRight="20dip" android:orientation="vertical" > <Button android:id="@+id/tipButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="SQLite数据库测试" android:layout_marginTop="15dip" android:clickable="false" /> <Button android:id="@+id/addButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="添加数据" android:layout_marginTop="15dip" /> <Button android:id="@+id/queryButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="查找数据" android:layout_marginTop="15dip" /> <Button android:id="@+id/updateButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="更新数据" android:layout_marginTop="15dip" /> <Button android:id="@+id/deleteButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="删除数据" android:layout_marginTop="15dip" /> <Button android:id="@+id/countButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="统计数据" android:layout_marginTop="15dip" /> <Button android:id="@+id/pageButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="数据分页" android:layout_marginTop="15dip" /> <Button android:id="@+id/transactionButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="事务操作" android:layout_marginTop="15dip" /> </LinearLayout>