zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

数据库的创建和操作

数据库 操作 创建
2023-09-11 14:15:38 时间

初步学习,一步步按照传智播客的视频操作的。

OtherePersonService为使用insert(),delete(),query(),update()等基本函数,与PersonService实现功能一样的,只是两种不同的写法。

 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="maureen.database"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="maureen.database.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <uses-library android:name="android.test.runner"/>"
    </application>
    
    <instrumentation android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="maureen.database"  android:label="Tests for my app"/>"

</manifest>


 

 

MainActivity.java

package maureen.database;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}


Person.java

package maureen.domain;

import android.R.integer;

public class Person {
	private Integer id;
	private String name;
	private String phone;

	public Person() {

	}

	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 + "]";
	}

}


DBOpenHelper.java

package maureen.service;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.text.AlteredCharSequence;

public class DBOpenHelper extends SQLiteOpenHelper {

	public DBOpenHelper(Context context) {
		/*
		 * super(context, name, factory, version);name--要创建的数据库的名称,factory-对查询后的
		 * 结果集进行随机访问(游标),传入null代表使用系统默认的游标工厂;version--数据库文件的版本号 不能为0
		 */
		super(context, "maureendb.db", null, 2);// 创建的数据库默认保存在<包>/databases/
		// TODO Auto-generated constructor stub
	}

	@Override
	public void onCreate(SQLiteDatabase db) {// 数据库第一次被创建的时候调用
		// TODO Auto-generated method stub
		db.execSQL("CREATE TABLE person(personid integer primary key autoincrement,name varchar(20))");

	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// 数据库文件版本号发生变更的时候调用,1变成2的时候就会调用此函数,且只调用此函数
		// TODO Auto-generated method stub
		db.execSQL("ALTER TABLE person ADD phone varchar(12) null");// 往表中增加一列
	}

}


PersonService.java

package maureen.service;

import java.util.ArrayList;
import java.util.List;

import android.R.integer;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import maureen.domain.Person;

public class PersonService {// 增、删、改、查

	private DBOpenHelper dbOpenHelper;

	public PersonService(Context context) {
		// super();
		this.dbOpenHelper = new DBOpenHelper(context);
	}

	/*
	 * 添加记录
	 */
	public void save(Person person) {
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();// 取得数据库操作实例
		db.execSQL("insert into person(name,phone)  values('"
				+ person.getName() + "','" + person.getPhone() + "')");// 或者用如下的方式赋值
		/*
		 * db.execSQL("insert into person(name,phone)  values(?,?)", new
		 * Object[]{person.getName(),person.getPhone()});
		 */
		// db.close();可以不关,不关可以提高性能,不用频繁打开数据库
	}

	/*
	 * 删除记录
	 */
	public void delete(Integer id) {
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
		db.execSQL("delete from person where personid=?)", new Object[] { id });

	}

	/*
	 * 修改记录
	 */
	public void update(Person person) {
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
		db.execSQL(
				"update person set name=?,phone=? where personid=?",
				new Object[] { person.getName(), person.getPhone(),
						person.getId() });
	}

	/*
	 * 
	 * 查找记录
	 */
	public Person find(Integer id) {
		SQLiteDatabase db = dbOpenHelper.getReadableDatabase();// 数据库磁盘空间没满的时候返回的操作实例就是getWritableDatabase与它一样,而如满了返回的就是只读的操作实例
		Cursor cursor = db.rawQuery("select * from person where personid=?",
				new String[] { id.toString() });// cursor对查询返回的结果集进行随机访问

		if (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;

	}

	/*
	 * 分页获取记录 param offset 跳过前面多少条记录 param maxResult 每页多少条记录
	 */

	public List<Person> getScrollData(int offset, int maxResult) {// 分页查询

		List<Person> persons = new ArrayList<Person>();
		SQLiteDatabase db = dbOpenHelper.getReadableDatabase();// 数据库磁盘空间没满的时候返回的操作实例就是getWritableDatabase与它一样,而如满了返回的就是只读的操作实例
		Cursor cursor = db.rawQuery(
				"select * from person order by personid asc limit ?,?",
				new String[] { String.valueOf(offset),
						String.valueOf(maxResult) });

		while (cursor.moveToNext()) {// 迭代
			int personid = cursor.getInt(cursor.getColumnIndex("personid"));
			String name = cursor.getString(cursor.getColumnIndex("name"));
			String phone = cursor.getString(cursor.getColumnIndex("phone"));

			persons.add(new Person(personid, name, phone));

		}
		cursor.close();
		return persons;

	}

	/*
	 * 
	 * 获取记录总数
	 */

	public long getCount() {// 取得记录总数
		SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
		Cursor cursor = db.rawQuery("select count(*) from person  ", null);
		cursor.moveToFirst();// 因为一定有一条记录,所以不用判断
		long result = cursor.getLong(0);// 只有一个字段,所以设为0
		cursor.close();
		return 0;

	}

}


 


package maureen.service;

import java.util.ArrayList;
import java.util.List;

import android.R.integer;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import maureen.domain.Person;

public class PersonService {// 增、删、改、查

	private DBOpenHelper dbOpenHelper;

	public PersonService(Context context) {
		// super();
		this.dbOpenHelper = new DBOpenHelper(context);
	}

	/*
	 * 添加记录
	 */
	public void save(Person person) {
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();// 取得数据库操作实例
		db.execSQL("insert into person(name,phone)  values('"
				+ person.getName() + "','" + person.getPhone() + "')");// 或者用如下的方式赋值
		/*
		 * db.execSQL("insert into person(name,phone)  values(?,?)", new
		 * Object[]{person.getName(),person.getPhone()});
		 */
		// db.close();可以不关,不关可以提高性能,不用频繁打开数据库
	}

	/*
	 * 删除记录
	 */
	public void delete(Integer id) {
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
		db.execSQL("delete from person where personid=?)", new Object[] { id });

	}

	/*
	 * 修改记录
	 */
	public void update(Person person) {
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
		db.execSQL(
				"update person set name=?,phone=? where personid=?",
				new Object[] { person.getName(), person.getPhone(),
						person.getId() });
	}

	/*
	 * 
	 * 查找记录
	 */
	public Person find(Integer id) {
		SQLiteDatabase db = dbOpenHelper.getReadableDatabase();// 数据库磁盘空间没满的时候返回的操作实例就是getWritableDatabase与它一样,而如满了返回的就是只读的操作实例
		Cursor cursor = db.rawQuery("select * from person where personid=?",
				new String[] { id.toString() });// cursor对查询返回的结果集进行随机访问

		if (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;

	}

	/*
	 * 分页获取记录 param offset 跳过前面多少条记录 param maxResult 每页多少条记录
	 */

	public List<Person> getScrollData(int offset, int maxResult) {// 分页查询

		List<Person> persons = new ArrayList<Person>();
		SQLiteDatabase db = dbOpenHelper.getReadableDatabase();// 数据库磁盘空间没满的时候返回的操作实例就是getWritableDatabase与它一样,而如满了返回的就是只读的操作实例
		Cursor cursor = db.rawQuery(
				"select * from person order by personid asc limit ?,?",
				new String[] { String.valueOf(offset),
						String.valueOf(maxResult) });

		while (cursor.moveToNext()) {// 迭代
			int personid = cursor.getInt(cursor.getColumnIndex("personid"));
			String name = cursor.getString(cursor.getColumnIndex("name"));
			String phone = cursor.getString(cursor.getColumnIndex("phone"));

			persons.add(new Person(personid, name, phone));

		}
		cursor.close();
		return persons;

	}

	/*
	 * 
	 * 获取记录总数
	 */

	public long getCount() {// 取得记录总数
		SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
		Cursor cursor = db.rawQuery("select count(*) from person  ", null);
		cursor.moveToFirst();// 因为一定有一条记录,所以不用判断
		long result = cursor.getLong(0);// 只有一个字段,所以设为0
		cursor.close();
		return 0;

	}

}


 

OtherPersonService.java

package maureen.service;

import java.util.ArrayList;
import java.util.List;

import android.R.integer;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import maureen.domain.Person;

public class OtherPersonService {// 增、删、改、查

	private DBOpenHelper dbOpenHelper;

	public OtherPersonService(Context context) {
		// super();
		this.dbOpenHelper = new DBOpenHelper(context);
	}

	/*
	 * 添加记录
	 */
	public void save(Person person) {
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();// 取得数据库操作实例
		ContentValues values = new ContentValues();
		values.put("name", person.getName());
		values.put("phone", person.getPhone());// key-字段名称,要和表中的名称一致
		db.insert("person", null, values);// null值字段,如果第三个参数传的是null值或者空集合就需要用第二个参数,第三个字段不为空的时候,就不需要指定第二个参数,直接为null就可以

		// db.execSQL("insert into person(name,phone)  values('"+person.getName()+"','"+person.getPhone()+"')");//或者用如下的方式赋值
		/*
		 * db.execSQL("insert into person(name,phone)  values(?,?)", new
		 * Object[]{person.getName(),person.getPhone()});
		 */
		// db.close();可以不关,不关可以提高性能,不用频繁打开数据库
	}

	/*
	 * 删除记录
	 */
	public void delete(Integer id) {
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
		db.delete("person", "personid=?", new String[] { id.toString() });
		// db.execSQL("delete from person where personid=?)",new Object[]{id});

	}

	/*
	 * 修改记录
	 */
	public void update(Person person) {
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();

		ContentValues values = new ContentValues();
		values.put("name", person.getName());
		values.put("phone", person.getPhone());
		db.update("person", values, "personid=?", new String[] { person.getId()
				.toString() });
		// db.execSQL("update person set name=?,phone=? where personid=?",new
		// Object[]{person.getName(),person.getPhone(),person.getId()});
	}

	/*
	 * 
	 * 查找记录
	 */
	public Person find(Integer id) {
		SQLiteDatabase db = dbOpenHelper.getReadableDatabase();// 数据库磁盘空间没满的时候返回的操作实例就是getWritableDatabase与它一样,而如满了返回的就是只读的操作实例
		// db.query(table, columns, selection, selectionArgs, groupBy, having,
		// orderBy)--column是要查询的字段,传入null就会返回所有字段
		Cursor cursor = db.query("person", new String[] { "personid", "name",
				"phone" }, "personid=?", new String[] { id.toString() }, null,
				null, null);

		// Cursor cursor=db.rawQuery("select * from person where personid=?",
		// new String[]{id.toString()});//cursor对查询返回的结果集进行随机访问

		if (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;

	}

	/*
	 * 分页获取记录 param offset 跳过前面多少条记录 param maxResult 每页多少条记录
	 */

	public List<Person> getScrollData(int offset, int maxResult) {// 分页查询

		List<Person> persons = new ArrayList<Person>();
		SQLiteDatabase db = dbOpenHelper.getReadableDatabase();// 数据库磁盘空间没满的时候返回的操作实例就是getWritableDatabase与它一样,而如满了返回的就是只读的操作实
		Cursor cursor = db.query("person", null, null, null, null, null,
				"personid asc", offset + "," + maxResult);
		/*
		 * Cursor
		 * cursor=db.rawQuery("select * from person order by personid asc limit ?,?"
		 * , new String[]{String.valueOf(offset),String.valueOf(maxResult)});
		 */

		while (cursor.moveToNext()) {// 迭代
			int personid = cursor.getInt(cursor.getColumnIndex("personid"));
			String name = cursor.getString(cursor.getColumnIndex("name"));
			String phone = cursor.getString(cursor.getColumnIndex("phone"));

			persons.add(new Person(personid, name, phone));

		}
		cursor.close();
		return persons;

	}

	/*
	 * 
	 * 获取记录总数
	 */

	public long getCount() {// 取得记录总数
		SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
		Cursor cursor = db.query("person", new String[] { "count(*)" }, null,
				null, null, null, null);
		// Cursor cursor=db.rawQuery("select count(*) from person  ", null);
		cursor.moveToFirst();// 因为一定有一条记录,所以不用判断
		long result = cursor.getLong(0);// 只有一个字段,所以设为0
		cursor.close();
		return 0;

	}

}


 

PersonServiceTest.java

package maureen.test;

import java.util.List;

import android.test.AndroidTestCase;
import android.util.Log;
import maureen.domain.Person;
import maureen.service.*;

public class PersonServiceTest extends AndroidTestCase {

	private static final String TAG = "PersonServiceTest";

	public void testCreateDB() throws Exception {
		DBOpenHelper dbOpenHelper = new DBOpenHelper(getContext());
		dbOpenHelper.getWritableDatabase();// 第一次调用getWritableDatabase函数就能自动创建数据库
	}

	public void testSave() throws Exception {
		PersonService service = new PersonService(this.getContext());
		for (int i = 0; i < 20; i++) {
			Person person = new Person("君君桑" + i, "15671684862" + i);
			service.save(person);
		}

	}

	public void testDelete() throws Exception {
		PersonService service = new PersonService(this.getContext());
		service.delete(21);

	}

	public void testUpdate() throws Exception {
		PersonService service = new PersonService(this.getContext());
		Person person = service.find(1);
		person.setName("君君");
		service.update(person);

	}

	public void testFind() throws Exception {// 测试的时候在Logcat里面的filter中放入PersonServiceTest再进行单元测试,在logcat中如果找到刚刚插入的记录,则测试通过
		PersonService service = new PersonService(this.getContext());
		Person person = service.find(1);
		Log.i(TAG, person.toString());

	}

	public void testScrollData() throws Exception {
		PersonService service = new PersonService(this.getContext());
		List<Person> persons = service.getScrollData(10, 5);
		for (Person person : persons) {
			Log.i(TAG, person.toString());

		}

	}

	public void testCount() throws Exception {
		PersonService service = new PersonService(this.getContext());
		long result = service.getCount();
		Log.i(TAG, result + "");

	}

}

OtherPersonServiceTest.java--与PersonServiceTest功能相同是为了测试OtherPersonService

package maureen.test;

import java.util.List;

import android.test.AndroidTestCase;
import android.util.Log;
import maureen.domain.Person;
import maureen.service.*;

public class OtherPersonServiceTest extends AndroidTestCase {

	private static final String TAG = "PersonServiceTest";

	public void testSave() throws Exception {
		OtherPersonService service = new OtherPersonService(this.getContext());

		Person person = new Person("xiaaosha", "15671684800");
		service.save(person);

	}

	public void testDelete() throws Exception {
		OtherPersonService service = new OtherPersonService(this.getContext());
		service.delete(21);

	}

	public void testUpdate() throws Exception {
		OtherPersonService service = new OtherPersonService(this.getContext());
		Person person = service.find(1);
		person.setName("赵君君");
		service.update(person);

	}

	public void testFind() throws Exception {// 测试的时候在Logcat里面的filter中放入PersonServiceTest再进行单元测试,在logcat中如果找到刚刚插入的记录,则测试通过
		OtherPersonService service = new OtherPersonService(this.getContext());
		Person person = service.find(1);
		Log.i(TAG, person.toString());

	}

	public void testScrollData() throws Exception {
		OtherPersonService service = new OtherPersonService(this.getContext());
		List<Person> persons = service.getScrollData(0, 5);
		for (Person person : persons) {
			Log.i(TAG, person.toString());

		}

	}

	public void testCount() throws Exception {
		OtherPersonService service = new OtherPersonService(this.getContext());
		long result = service.getCount();
		Log.i(TAG, result + "");

	}

}


 


package maureen.test;

import java.util.List;

import android.test.AndroidTestCase;
import android.util.Log;
import maureen.domain.Person;
import maureen.service.*;

public class OtherPersonServiceTest extends AndroidTestCase {

	private static final String TAG = "PersonServiceTest";

	public void testSave() throws Exception {
		OtherPersonService service = new OtherPersonService(this.getContext());

		Person person = new Person("xiaaosha", "15671684800");
		service.save(person);

	}

	public void testDelete() throws Exception {
		OtherPersonService service = new OtherPersonService(this.getContext());
		service.delete(21);

	}

	public void testUpdate() throws Exception {
		OtherPersonService service = new OtherPersonService(this.getContext());
		Person person = service.find(1);
		person.setName("赵君君");
		service.update(person);

	}

	public void testFind() throws Exception {// 测试的时候在Logcat里面的filter中放入PersonServiceTest再进行单元测试,在logcat中如果找到刚刚插入的记录,则测试通过
		OtherPersonService service = new OtherPersonService(this.getContext());
		Person person = service.find(1);
		Log.i(TAG, person.toString());

	}

	public void testScrollData() throws Exception {
		OtherPersonService service = new OtherPersonService(this.getContext());
		List<Person> persons = service.getScrollData(0, 5);
		for (Person person : persons) {
			Log.i(TAG, person.toString());

		}

	}

	public void testCount() throws Exception {
		OtherPersonService service = new OtherPersonService(this.getContext());
		long result = service.getCount();
		Log.i(TAG, result + "");

	}

}