SQLite

1.SQLite是安卓平台上集成的一个嵌入式关系型数据库。无需自动安装。
  当需要是系统动态生成数据库。


  每个应用的数据库位置:
  /data/data/应用包名/databases/数据库


2.SQLiteOpenHelper
  作用:用来创建,打开和管理数据库(创建表和更新表字段)。


  1)写一个类继承SQLiteOpenHelper,并且要有构造方法,还要实现两个方法 onCreate onUpgrade


  构造方法参数中,String name 表示数据库的名字;
                  version 表示数据库版本,从1开始。当version值改变时,会调用onUpgrade方法升级。


  onCreate方法:数据库第一次创建时调用,在该方法中创建表。
  onUpgrade方法:数据库升级时调用,当版本号改变时升级,一般在该方法中增加表的字段。


  2)一般写成单例类。


  例:

public class MyOpenHelper extends SQLiteOpenHelper {

	private static MyOpenHelper mInstance;
	// 数据库名
	private static String name = "MYDB.db";

	private MyOpenHelper(Context context, String name, CursorFactory factory,
			int version) {
		super(context, name, factory, version);
	}

	//获取实例对象
	public static MyOpenHelper getInstance(Context context) {
		if (mInstance == null) {
			mInstance = new MyOpenHelper(context, name, null, 1);
		}
		return mInstance;
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		// 创建表
		db.execSQL("create table mm(_id integer primary key autoincrement, name text)");
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		//当获取实例方法中version改变时调用upgrade方法
		db.execSQL("alter table mm add age integer null");
	}

  }

3)getWritableDatabase()/getReadableDatabase()
  调用这两个方法时,如果还没有数据库,那么会自动创建一个数据库并返回;如果已经存在,那么直接打开返回



3.SQLiteDatabase


  1)通过helper获得实例

 

SQLiteDatabase database = helper.getWritableDatabase(); //getReadableDatabase()

2)方法


  *查询 --- rawQuery("查询语句", "查询条件")
   注:当查询语句中带有?时,查询条件为实际值。一般直接在查询语句中写全。

Cursor cursor = database.rawQuery("select * from m", null);

 一般用完cursor后关闭游标:cursor.close();
  
  *增删改 --- execSQL("增删改的SQL语句")

database.execSQL("insert into mm(name,age) values('小乔',22)");
database.execSQL("update mm set age = 18 where _id = 1");
database.execSQL("delete from mm where _id = 1");

例:

public class MainActivity extends Activity implements OnClickListener {

	private SQLiteDatabase database;
	private MyOpenHelper helper;

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

	}

	/**
	 * 省略了按钮的初始化
	 */
	@Override
	public void onClick(View v) {

		switch (v.getId()) {
		//创建数据库
		case R.id.create:
			helper = MyOpenHelper.getInstance(this);
			database = helper.getWritableDatabase();
			break;

		//查询
		case R.id.query:

			Cursor cursor = database.rawQuery("select * from mm", null);
			while (cursor.moveToNext()) {
				int _id = cursor.getInt(cursor.getColumnIndex("_id"));
				String name = cursor.getString(1);
				int age = cursor.getInt(2);

				System.out.println("_id = " + _id + " name = " + name
						+ " age = " + age);
			}

			cursor.close();

			break;

		//插入
		case R.id.insert:
			database.execSQL("insert into mm(name,age) values('小昭',22)");
			break;
		
		//更新
		case R.id.update:
			database.execSQL("update mm set age = 18 where _id = 1");
			break;
		
		//删除
		case R.id.delete:
			database.execSQL("delete from mm where _id = 1");
			break;

		default:
			break;
		}
	}

}

3)面向对象方法
  为了防止安卓程序员不会SQL语言,安卓还封装了一套面向对象的方法用于增删改查。
  一般推荐使用这几个方法进行增删改查,因为可以与JavaBean对象结合。即表中每行对应一个JavaBean
  
  *ContentValues 
   相当于Map --- 存放键值对

 

ContentValues values = new ContentValues();
   values.put("键", "值");
  *增
   insert("表名", "空值字段", ContentValues);
   如:database.insert("mm", "_id", values);


  *查询
   query(table, columns, selection, selectionArgs, groupBy, having, orderBy);
   如:database.query("mm", new String[]{"*"}, null, null, null, null, null); //查询所有
   返回值 Cursor


  *更新
   update(table, values, whereClause, whereArgs)
   如:database.update("mm", values, new String[]{"_id = ?"}, new String[]{"1"});


  *删除
   delete(table, whereClause, whereArgs)
   如:database.delete("mm", new String[]{"_id = ?"}, new String[]{"1"});


public class MMService {

	private MyOpenHelper helper;

	public MMService(Context context) {
		helper = MyOpenHelper.getInstance(context);
	}

	public void insert(MM mm) {
		SQLiteDatabase db = helper.getWritableDatabase();
		ContentValues values = new ContentValues();
		values.put("name", mm.getName());
		values.put("age", mm.getAge());
		db.insert("mm", "_id", values);

		db.close();
	}

	public List<MM> queryAll() {
		SQLiteDatabase db = helper.getWritableDatabase();
		List<MM> list = new ArrayList<MM>();
		Cursor cursor = db.query("mm", new String[] { "*" }, null, null, null,
				null, null);
		while (cursor.moveToNext()) {
			int _id = cursor.getInt(0);
			String name = cursor.getString(1);
			int age = cursor.getInt(2);
			MM mm = new MM();
			mm.set_id(_id);
			mm.setName(name);
			mm.setAge(age);
			list.add(mm);
		}

		cursor.close();
		db.close();

		return list;
	}

	public void update(MM mm) {
		SQLiteDatabase db = helper.getWritableDatabase();
		ContentValues values = new ContentValues();
		values.put("name", mm.getName());
		values.put("age", mm.getAge());
		String whereClause = "_id = ?";
		String[] whereArgs = { mm.get_id() + "" };
		db.update("mm", values, whereClause, whereArgs);

		db.close();

	}

	public void delete(int _id) {

		SQLiteDatabase db = helper.getWritableDatabase();
		String whereClause = "_id = ?";
		String[] whereArgs = { _id + "" };
		db.delete("mm", whereClause, whereArgs);
	}
}


<span style="white-space:pre">	</span>public void onClick(View v) {

		switch (v.getId()) {
		case R.id.create:
			helper = MyOpenHelper.getInstance(this);
			database = helper.getWritableDatabase();
			break;

		case R.id.query:

			List<MM> list = service.queryAll();
			for (MM mm : list) {
				System.out.println(mm);
			}

			break;

		case R.id.add:
			service.insert(new MM(1, "小乔", 22));
			break;

		case R.id.update:
			service.update(new MM(1, "小乔", 18));
			break;

		case R.id.delete:
			service.delete(1);
			break;

		default:
			break;
		}
	}



4.Cursor
  方法:
  
  得到某字段对应的索引: cursor.getColumnIndex("_id");


  int _id = cursor.getInt(0); 
  int _id = cursor.getInt(cursor.getColumnIndex("_id")); 


  String name = cursor.getString(1);


  用完后将cursor关闭:cursor.close();
  


5.事务
  保证事务的一致性,完整性和安全性。
  
  database.beginTransaction();
  database.setTransactionSuccessful();
  database.endTransaction();

  例:

     try{
	
	database.beginTransaction();

	... //代码

	//如果期间抛出异常,那么改行代码不会执行,则上面代码操作失败,代码业务不会发生改变
	database.setTransactionSuccessful();

     }catch(){

     }finally{
	database.endTransaction();
	database.close();
     }


*************************************
分页查询limit

1.SQL语句
  select * from mm limit 0 , 3

  开始查询的位置
  每次查询数据数目

2.使用SQLiteDatabase的query方法进行分页查询

  使用最后一个带limit参数的query方法:
  db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)

/**
	 * 分页查询
	 * @param startId 该页的起始值
	 * @param block 每页显示的数目
	 * @return
	 */
	public Cursor limitedQuery(int startId, int block) {
		SQLiteDatabase db = helper.getWritableDatabase();
		return db.query("mm", new String[] { "*" }, null, null, null, null,
				null, startId + "," + block);
	}

3.当每页显示固定数目且有上一页和下一页按钮时,判断是否是首页或最后一页条件

  翻页时,startId数值的确定    startId = startId + block; //即下一页起始值是当前页起始值加上该页显示的数目

  判断是否是首页:if(startId == 0) //当前已经是首页
  判断是否是最后一页:if(startId + block >= cursor.getCount())  //当前页是最后一页

4.如果是将分页数据显示到listview,那么每点击一次上一页或下一页,都要进行刷新,因为分页查询返回Cursor,
  所以直接 adapter.changeCursor(cursor);


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值