Mars老师sqlite学习笔记

晚上跟着Mars老师的视频学习了sqlite的一些用法,程序运行得起来,但还是会有很多意外退出的情况。

详细的解释也放在代码段里面好了。

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:orientation="vertical"
    tools:context="${relativePackage}.${activityClass}" >


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="sqlite3测试程序" />


    <Button
        android:id="@+id/btnCreate"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="创建数据库" />


    <Button
        android:id="@+id/btnInsert"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="添加数据" />


    <Button
        android:id="@+id/btnUpdate"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="更新" />


    <Button
        android:id="@+id/btnQuery"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="查询数据库" />


    <Button
        android:id="@+id/btnDel"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="删除表格" />
    
    <Button 
        android:id="@+id/btnUpdate_database"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="更新数据库"
        />


</LinearLayout>

Java代码

分为两个包,分别用于存放MainActivity和DataBaseHelper这个database辅助类。

MainActivity.java

package com.Harris.mysqlite;

import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

import com.Harris.Mysqlite_db.DataBaseHelper;

public class MainActivity extends Activity {
	private Button btnCreate;
	private Button btnInsert;
	private Button btnUpdate;
	private Button btnDel;
	private Button btnQuery;
	private Button btnUpdate_Database;

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		btnCreate = (Button) findViewById(R.id.btnCreate);
		btnInsert = (Button) findViewById(R.id.btnInsert);
		btnUpdate = (Button) findViewById(R.id.btnUpdate);
		btnDel = (Button) findViewById(R.id.btnDel);
		btnQuery = (Button) findViewById(R.id.btnQuery);
		btnUpdate_Database = (Button) findViewById(R.id.btnUpdate_database);

		sqlListener listener = new sqlListener();

		btnCreate.setOnClickListener(listener);
		btnInsert.setOnClickListener(listener);
		btnUpdate.setOnClickListener(listener);
		btnDel.setOnClickListener(listener);
		btnQuery.setOnClickListener(listener);
		btnUpdate_Database.setOnClickListener(listener);
	}

	class sqlListener implements OnClickListener {
		DataBaseHelper dbHelper;
		SQLiteDatabase db;
		ContentValues values;

		@Override
		public void onClick(View v) {

			switch (v.getId()) {
			case R.id.btnCreate:
				// 还记得前面DataBaseHelper的两个参数的构造函数吗,这个"mydata_base"就是创建的数据库的名字,表格的名字不在这里写
				// getReadableDatabase()表示只读
				// 想要操作数据库,必须调用getReadableDatabase或getWriteableDatabase才能获得db对象,
				// 才能操作或打开数据库
				dbHelper = new DataBaseHelper(MainActivity.this, "mydata_base");
				db = dbHelper.getReadableDatabase();
				break;

			case R.id.btnInsert:
				//Insert方法需要创建一个ContentValues对象,用于存储需要放入的数据类型,
				//ContentValues是以键值对得方式存数据的
				//key是String类型,值必须和数据库中之前预先设定好的值类型一致
				dbHelper = new DataBaseHelper(MainActivity.this, "mydata_base", 2);
				db = dbHelper.getWritableDatabase();
				values = new ContentValues();
				values.put("id", 1);
				values.put("name", "张三");
				values.put("id", 2);
				values.put("name", "小红");
				//最后通过db的insert方法将values插入<span style="font-family: Arial, Helvetica, sans-serif;">mydata_base</span><span style="font-family: Arial, Helvetica, sans-serif;">中,完成insert操作。</span>
				db.insert("mydata_base", null, values);
				break;
				
//这里的update操作只是简单的更新版本号,需要是writeable的
			case R.id.btnUpdate:
				dbHelper = new DataBaseHelper(MainActivity.this, "mydata_base",2);
				db = dbHelper.getWritableDatabase();
				break;
//query应该是最麻烦的了,需要通过query方法生成一个Cursor对象,
//然后通过cursor的getColumnIndex方法获得列号,再通过getString方法获得该列的Srting数值
			case R.id.btnQuery:
				dbHelper = new DataBaseHelper(MainActivity.this, "mydata_base");
				db = dbHelper.getReadableDatabase();
				Cursor cursor = db.query("user", new String[] { "id", "name" }, "id=?", new String[] { "1" }, null,
						null, null);
				while (cursor.moveToNext()) {
					String name = cursor.getString(cursor.getColumnIndex("name"));
					System.out.println("quer......" + name);
				}
				break;
//del方法Mars老师没讲,DROPTABLE用于从数据库中清除表格,由于之前写的表格的名称就是user,很清楚了
			case R.id.btnDel:
				dbHelper = new DataBaseHelper(MainActivity.this, "mydata_base");
				db = dbHelper.getWritableDatabase();
				db.execSQL("DROPTABLEuser");
				db.close();
				break;
				
//这里就是真实的添加了一个数据然后更新了
			case R.id.btnUpdate_database:
				// 更新操作就相当于执行SQL语句当中的update语句
				// UPDATE table_name SET XXCOL=XXX WHERE XXCOL=XX...
				// TODO Auto-generated method stub
				// 得到一个可写的SQLiteDatabase对象
				DataBaseHelper dbHelper = new DataBaseHelper(MainActivity.this, "mydata_base");
				SQLiteDatabase db = dbHelper.getWritableDatabase();
				ContentValues values = new ContentValues();
				values.put("name", "zhangsanfeng");
				// 第一个参数是要更新的表名
				// 第二个参数是一个ContentValeus对象
				// 第三个参数是where子句
				db.update("user", values, "id=?", new String[] { "1" });
				break;

			}

		}

	}

}
DataBaseHelper.java

package com.Harris.Mysqlite_db;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
//Android提供了SQLiteOpenHelper这个类用于操作数据库
public class DataBaseHelper extends SQLiteOpenHelper {
	private static final int VERSION = 1;
//这里面是三个constructor需要声明,区别仅仅在于构造函数的参数数量不同,重载了
//四个参数的构造函数,Context指上下文,String name是要打开数据库的名称,不是表格的名称,
//CursorFactory直接用null就可以了,VERSION表示版本,定义一个静态常量使用
	
	public DataBaseHelper(Context context, String name, CursorFactory factory,
			int version) {
		super(context, name, factory, VERSION);
		// TODO Auto-generated constructor stub
	}

	public DataBaseHelper(Context context, String name, int version) {
		// 这里不要用super,用this表示调用该类的构造方法。
		// super的构造方法始终只有四个参数的那个
		this(context, name, null, VERSION);
	}
//这里用的是this,调用了上面的三个参数的构造函数
	public DataBaseHelper(Context context, String name) {
		this(context, name, VERSION);

	}
//onCreate方法和onUpgrade本身就是抽象的,所以必须复写,
//作为回调函数,在数据库被创造和update过程中分别回调
//onCreate里面写了execSQL语句,创建新的数据库
//注意user是table的名称、int类型的id,varchar(20)类型的name,varchar和String差不多,varchar可变性更好
	@Override
	public void onCreate(SQLiteDatabase db) {
		System.out.println("onCreate方法被调用!");
		db.execSQL("create table user(id int, name varchar(20))");

	}
//这里简单的打印一句话表示onUpgrade方法被调用
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		System.out.println("onUpgrade方法被调用!");

	}

}
大致的原理都说的很清楚了,希望自己之后能够在这个些代码的基础上自己做起来一个sqlite应用。

此外,还有adb命令行工具的使用介绍:

cmd打开后:adb shell进入Linux命令行,然后开始输入ls -l,再依次打开data/data/com.Harris.mysqlite/databases文件夹,模拟器里面添加数据库按钮之后这个databases文件夹才会生成,里面有一个lib文件。

然后使用sqlite3 [数据库名]进入sqlite命令环境,可以使用SQL语句,例如 .schema和SELECT * FROM user(展示出user这个表里面所有的数据)。

大致就是这样。

在DDMS的File Explorer里面应该也能看到这个表格,只是我没能提取出来文件。project已经上传到github上面在,最近才慢慢开始学会使用这些工具,慢慢来吧,不怕。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值