安卓笔记3--SQLite数据库和对话框


现在介绍一下安卓如何操作数据库和几种常见的安卓对话框。老规矩,用一张图来介绍今天的内容。

图片看不清的话可以右键新窗口打开

技术分享


一、SQLite数据库

SQLite,是一款轻量型的数据库,是遵守 ACID(原子性、一致性、隔离性、持久性)的关联式数据库管理系统,多用于嵌入式开发中。

SQLite 数据库是无类型的,可以向一个 integer 的列中添加一个字符串,但它又支持常见的类型比如: NULL, VARCHAR, TEXT, INTEGER, BLOB, CLOB 等

1,创建一个数据库帮助类,用于操作数据库

创 建 一 个 PersonOpenHelper 类 , 继 承 SQLiteOpenHelper 抽 象 类 , 重写onCreate 和 onUpgrade 方法。

public class PersonSQLiteOpenHelper extends SQLiteOpenHelper {
	
	/**
	 * 把已知的固定值写好(数据库名称,版本号), 外边只传一个Context进来就可以初始化该帮助类了
	 * @param context
	 */
	public PersonSQLiteOpenHelper(Context context){
		// 转调4个参数的构造函数
		this(context, "jin8.db", null, 3);
	}

	/**
	 * 创建一个数据库帮助类, 去创建\ 打开\ 管理 数据库.
	 * @param context 上下文.
	 * @param name 设置数据库名称
	 * @param factory  CursorFactory 定义一个结果集, 游标工厂. 
	 * 					Cursor 游标(结果集, 保存了对数据库的引用, 指针)
	 * 					设置为null表示使用系统默认游标工厂
	 * @param version 数据库的版本, 从1开始 >= 1  
	 */
	public PersonSQLiteOpenHelper(Context context, String name,
			CursorFactory factory, int version) {
		super(context, name, factory, version);
	}

	/**
	 * 当数据库第一次被创建时调用, 这里进行表结构的创建和初始化.
	 */
	@Override
	public void onCreate(SQLiteDatabase db) {
		System.out.println("PersonSQLiteOpenHelper: onCreate");
		
		// 执行创建语句, 创建person表
		db.execSQL("create table person(_id integer primary key autoincrement, name varchar(20),age integer)");
		
	}

	/**
	 * 数据库升级时调用, 在这里做表结构的更新,删除等操作.
	 */
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		System.out.println("PersonSQLiteOpenHelper: onUpgrade " + "旧版本号: " + oldVersion + " 新版本号: " + newVersion);
		
		if(oldVersion == 2 && newVersion == 3){
			// 版本从2升级到3, 给person表添加一个balance余额字段
			db.execSQL("alter table person add column balance integer");
		}
		
	}

}

2,SQL操作语句

public class PersonDAO2 {
	
	private PersonSQLiteOpenHelper helper;
	
	public PersonDAO2(Context context){
		helper = new PersonSQLiteOpenHelper(context);
	}

	/**
	 * 插入一条数据, 指定名称和年龄
	 * @param name
	 * @param age
	 */
	public void insert(String name, int age) {
		// 获取可写数据库
		SQLiteDatabase db = helper.getWritableDatabase();
		db.execSQL("insert into person (name, age) values (?, ?)", new Object[]{name, age});
		
	}

	/**
	 * 根据指定名称删除一条数据
	 * @param name
	 */
	public void delete(String name) {
		
		SQLiteDatabase db = helper.getWritableDatabase();
		db.execSQL("delete from person where name = ?", new Object[]{name});
		
	}

	/**
	 * 修改一条数据, 修改指定人的年龄
	 * @param name
	 * @param age
	 */
	public void update(String name, int age) {

		SQLiteDatabase db = helper.getWritableDatabase();
		db.execSQL("update person set age = ? where name = ?", new Object[]{age, name});
	}

	/**
	 * 查询一条数据
	 * @param name
	 */
	public void querySingleRecord(String nameArg) {
		
		SQLiteDatabase db = helper.getReadableDatabase();
		
		// ------------------------------------------------- 重点 ↓

		// 游标, 对数据库的引用
		Cursor cursor = db.rawQuery("select * from person where name = ?", new String[]{nameArg});
		
		if(cursor != null && cursor.moveToFirst()){ // 是否能移动到第一个
			int _id = cursor.getInt(0);
			String name = cursor.getString(1);
			int age = cursor.getInt(2);
			System.out.println("_id: " + _id + " name: " + name + " age: " + age);
		}
		// 关闭应用
		cursor.close();

		// ------------------------------------------------- 以上 ↑
		
	}

	/**
	 * 查询所有数据
	 */
	public List<Person> queryAll() {

		SQLiteDatabase db = helper.getReadableDatabase();
		Cursor cursor = db.rawQuery("select * from person", null);
		
		ArrayList<Person> persons = new ArrayList<Person>();
		
		if(cursor != null && cursor.getCount() > 0){
			// 循环遍历
			
			// 获取列数
			int columnCount = cursor.getColumnCount();
			System.out.println("columnCount: " + columnCount);
			
			while(cursor.moveToNext()){ // 直到下一个没有数据, 返回false

				// cursor.getColumnIndex("_id")// 根据列名获取列的索引
				
				int _id = cursor.getInt(cursor.getColumnIndex("_id"));
				String name = cursor.getString(cursor.getColumnIndex("name"));
				int age = cursor.getInt(cursor.getColumnIndex("age"));
				Person person = new Person(_id, name, age);
				System.out.println(person.toString());
				persons.add(person);
			}
		}
		cursor.close();
		
		return persons;
	}
}



二、对话框

1,通知对话框

public void showNotifyDialog(View view){
		
		// 1. 通知对话框
				Builder builder = new AlertDialog.Builder(this);
				// 设置图标
				builder.setIcon(android.R.drawable.ic_dialog_alert);
				// 设置标题
				builder.setTitle("提醒:");
				// 设置提醒内容
				builder.setMessage("当前是移动网络数据, 建议在wifi下观看, 是否继续(土豪随意)");
				
				builder.setPositiveButton("确认", new OnClickListener() {
					
					@Override
					public void onClick(DialogInterface dialog, int which) {
						Toast.makeText(MainActivity.this, "确认", 0).show();
						
					}
				});
				builder.setNegativeButton("取消", new OnClickListener() {
					
					@Override
					public void onClick(DialogInterface dialog, int which) {
						Toast.makeText(MainActivity.this, "取消", 0).show();
					}
				});
				
				builder.setCancelable(false); // 是否可以通过返回键 关闭
				
				// 创建AlertDialog
//				AlertDialog dialog = builder.create();
//				dialog.show();
				
				// 直接show();
				builder.show();
	}



2,显示列表对话框

public void showListDialog(View view){

		Builder builder = new AlertDialog.Builder(this);
		builder.setTitle("选择语言");
		String[] strs = new String[]{"java", "c++", "c" , "php", "c#", "c" , "php", "c#"};
		builder.setItems(strs, new OnClickListener() {
			
			@Override
			public void onClick(DialogInterface dialog, int which) {
				System.out.println("which: " + which);
			}
		});
		
		builder.show();
		
	}


3,显示单选对话框


public void showSingleDialog(View view){
		
		Builder builder = new AlertDialog.Builder(this);
		builder.setTitle("选择性别:");
		
		final String[] items = new String[]{"男", "女", "中性", "以前男的女的", "以前是女的男的"};
		
		builder.setSingleChoiceItems(items, -1, new OnClickListener() {
			
			@Override
			public void onClick(DialogInterface dialog, int which) {
				System.out.println("which: " + which);
				
			}
		});
		
		builder.setPositiveButton("确认", null);
		builder.show();
		
	}



4,显示复选对话框

public void showMultiDialog(View view){

		Builder builder = new AlertDialog.Builder(this);
		builder.setTitle("选择兴趣爱好:");

		final String[] items = new String[]{"抽烟", "喝酒", "烫头", "编程", "泡妞"};
		final boolean[] checkedItems = new boolean[]{true, false, true ,false, false};
		
		builder.setMultiChoiceItems(items,checkedItems , new OnMultiChoiceClickListener() {
			
			@Override
			public void onClick(DialogInterface dialog, int which, boolean isChecked) {
				System.out.println("which: " + which + " isChecked: " + isChecked);			
				checkedItems[which] = isChecked;
			}
		});
		builder.setPositiveButton("确认", null);
		
		builder.show();
	}




5,进度条


public void showProgressDialog(View view){
		// 显示一个加载的对话框
//		ProgressDialog.show(this, "提示: ", "正在加载中,请稍后...");
		
		final ProgressDialog progressDialog = new ProgressDialog(this);
		progressDialog.setTitle("提示: ");
		progressDialog.setMessage("正在加载中...");
		// 设置样式为 横向 的
		progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
		
		progressDialog.setMax(100);
		
		// 显示的时候, 会把进度归零
		progressDialog.show();
		
		new Thread(){
			public void run() {
				
				
				while(true){
					
					SystemClock.sleep(50);
//					progressDialog.setProgress(i);
					progressDialog.incrementProgressBy(1);
					
					
					if(progressDialog.getProgress() >= progressDialog.getMax()){
						progressDialog.dismiss();
						break;
					}
					
				}
				
			};
		}.start();
		
	}




郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。