晚上跟着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上面在,最近才慢慢开始学会使用这些工具,慢慢来吧,不怕。