0116sqlite
adb 是一个调试工具 ,通过这个调试工具可以通过命令行来访问数据库 android访问数据库必须要使用SQLiteOpenHelper这个类,否则访问起来比较复杂 里面提供了一系列的方法 当需要操作SQlite这个数据库的时候,首先必须要有SQLiteOpenHelper这个类的对象,由于这个类是一个抽象类,必须写一个类来继承它,继承它后拥有getReadableDatebase()和getWritableDatebase()这两个函数,这两个函数都是得到的对象都是SQLiteDatebase类的对象
复写的方法onCreat() ,onUpgrade() 该函数式在第一次创建数据库的时候执行,实际上是在第一次得到SQliteDatebase对象的时候才会调用这个方法,意思就是仅仅生成DatebaseHelper(继承SQliteOpenHelper)的对象是无法执行这两个函数,只有调用getReadableDatebase 和getWritableDatebase时候才会调用这些方法
adb是一种android提供的调试工具,可以以linux下调式应用程序
ContentValues 插入键值对,其中键是列名,值是希望插入到这一列的值
onUpgrade() 当你的应用要更新升级的时候,同时新版本中数据库表结构或内容有变化,这时upgrade方法会根据你的数据库版本号来判断数据库是否升级,你可以在upgrade方法中执行数据库的变化。
SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) 注意最后一个参数version,它表示当前数据库的版本,当版本不同时,会自动调用onUpgrade()方法去更新。 比如:第一次调用SQLiteOpenHelper类的子类时version=1,第二次调用SQLiteOpenHelper类的子类时version=2,则在第二次时会自动调用onUpgrade()方法去更新。
SQLiteActivity.java
1 package com.example.mars_sqlite; 2 3 import com.example.mars_sqlite.db.DatebaseHelper; 4 5 import android.R.string; 6 import android.os.Bundle; 7 import android.app.Activity; 8 import android.content.ContentValues; 9 import android.database.Cursor; 10 import android.database.sqlite.SQLiteDatabase; 11 import android.view.Menu; 12 import android.view.View; 13 import android.view.View.OnClickListener; 14 import android.widget.Button; 15 16 public class SQLiteActivity extends Activity { 17 18 private Button createButton; 19 private Button upgradeButton; 20 private Button insertButton; 21 private Button updateRecordButton; 22 private Button queryButton; 23 @Override 24 protected void onCreate(Bundle savedInstanceState) { 25 super.onCreate(savedInstanceState); 26 setContentView(R.layout.sqlite); 27 createButton=(Button)findViewById(R.id.createButton); 28 upgradeButton=(Button)findViewById(R.id.upgradeButton); 29 insertButton=(Button)findViewById(R.id.insertButton); 30 updateRecordButton=(Button)findViewById(R.id.updateRecordButton); 31 queryButton=(Button)findViewById(R.id.queryButton); 32 createButton.setOnClickListener(new createListener()); 33 upgradeButton.setOnClickListener(new upgradeListener()); 34 insertButton.setOnClickListener(new insertListener()); 35 updateRecordButton.setOnClickListener(new updateRecordListener()); 36 queryButton.setOnClickListener(new queryListener()); 37 } 38 //下面类创建数据库 39 class createListener implements OnClickListener 40 { 41 42 @Override 43 public void onClick(View v) { 44 // TODO Auto-generated method stub 45 //创建数据库助手对象,第一参数表示和当前这个Activity绑定,数据库取名为mars_db_test,这个是真实的名字。db是代码操作的名字 46 DatebaseHelper dbHelper=new DatebaseHelper(SQLiteActivity.this,"mars_db_test2"); 47 //只有调用了DatabaseHelper对象的getReadableDatabase()方法, 48 //或者是getWritableDatabase()方法之后,才会创建,或打开一个数据库 49 SQLiteDatabase db=dbHelper.getReadableDatabase();//创建数据库对象db 50 51 52 } 53 54 } 55 //SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) 56 //注意最后一个参数version,它表示当前数据库的版本,当版本不同时,会自动调用onUpgrade()方法去更新。 57 //比如:第一次调用SQLiteOpenHelper类的子类时version=1,第二次调用 58 //SQLiteOpenHelper类的子类时version=2,则在第二次时会自动调用onUpgrade()方法去更新。 59 //调用2号版本可以执行增添修改等操作 60 class upgradeListener implements OnClickListener 61 { 62 63 @Override 64 public void onClick(View v) { 65 // TODO Auto-generated method stub 66 DatebaseHelper dbHelper=new DatebaseHelper(SQLiteActivity.this,"mars_db_test2",2); 67 SQLiteDatabase db=dbHelper.getReadableDatabase(); 68 } 69 70 } 71 class insertListener implements OnClickListener 72 { 73 //ContentValues 插入键值对,其中键是列名,值是希望插入到这一列的值 74 @Override 75 public void onClick(View v) { 76 // TODO Auto-generated method stub 77 ContentValues values=new ContentValues(); 78 values.put("id",1);//第一列 79 values.put("name"," zhangsan");//第二列插入名字 80 values.put("password",123);//第三列插入密码 81 DatebaseHelper dbHelper=new DatebaseHelper(SQLiteActivity.this,"mars_db_test2",2); 82 SQLiteDatabase db=dbHelper.getWritableDatabase();//因为要开始写数据了,所以调用getWritableDatabase() 83 db.insert("user", null, values);//insert是不允许插入空行,不然隐式的插入null; 84 } 85 86 } 87 class updateRecordListener implements OnClickListener 88 { 89 90 @Override 91 public void onClick(View v) { 92 // TODO Auto-generated method stub 93 DatebaseHelper dbHelper=new DatebaseHelper(SQLiteActivity.this,"mars_db_test2",2); 94 SQLiteDatabase db=dbHelper.getWritableDatabase();//创建可写数据库 95 ContentValues values=new ContentValues(); 96 97 values.put("name", "zhangsanfeng"); 98 values.put("password", 456); 99 db.update("user", values, "id=?", new String[]{"1"}); 100 101 102 103 //update(String table, ContentValues values, String whereClause, String[] whereArgs) 104 105 106 107 } 108 109 } 110 class queryListener implements OnClickListener 111 { 112 113 @Override 114 public void onClick(View v) { 115 // TODO Auto-generated method stub 116 DatebaseHelper dbHelper=new DatebaseHelper(SQLiteActivity.this,"mars_db_test2",2); 117 SQLiteDatabase db=dbHelper.getWritableDatabase();//创建可写数据库 118 //d得到游标 119 Cursor cursor=db.query("user",new String[]{"id", "name","password"}, "id=?", new String[]{"1"} ,null, null,null); 120 while(cursor.moveToNext()) 121 { 122 int id =cursor.getInt(cursor.getColumnIndex("id")); 123 String name =cursor.getString(cursor.getColumnIndex("name"));//得到编号,通过编号得到 124 //getString()里面不是列名而是这一列在列里面的编号,是第几列 比如password是第3列,刚刚取的是第id=1的一行 125 String password =cursor.getString(cursor.getColumnIndex("password"));//跟上列的编号,必须是第几列,再把这一列值取出来 126 System.out.println(id); 127 System.out.println("name is"+name); 128 System.out.println("password is"+password); 129 } 130 131 } 132 133 } 134 135 136 137 }
DatabaseHelper.java
1 //第一,getReadableDatabase(),getWritableDatabase()可以获得SQLiteDatabse对象,通过该对象可以对数据库进行操作 2 //即通过数据库助手类,可以通过他的两个函数得到可读或者可写的数据库对象 3 //第二,提供了onCreate()和onUpgrade()两个回调函数,允许我们在创建和升级数据库时,进行自己的操作 4 //自定义SQLiteOpenHelper,必需要实现onCreate(), onUpgrade(),可以选择实现onOpen。 5 package com.example.mars_sqlite.db; 6 7 import android.content.Context; 8 import android.database.sqlite.SQLiteDatabase; 9 import android.database.sqlite.SQLiteDatabase.CursorFactory; 10 import android.database.sqlite.SQLiteOpenHelper; 11 //A helper class to manage database creation and version management. 12 13 public class DatebaseHelper extends SQLiteOpenHelper 14 { 15 16 public DatebaseHelper(Context context, String name, CursorFactory factory, 17 int version) { 18 super(context, name, factory, version); 19 // TODO Auto-generated constructor stub 20 } 21 22 public DatebaseHelper(Context context,String name,int version) 23 24 { 25 this(context ,name ,null, version);//调用上面四个参数的构造函数 26 } 27 public DatebaseHelper(Context context,String name ) 28 { 29 this (context ,name ,1);//调用上面三个参数的构造函数 30 } 31 32 //下面函数要创建实际上是在第一次得到SQliteDatebase对象的时候才会调用这个方法, 33 //意思就是仅仅生成DatebaseHelper(继承SQliteOpenHelper)的对象是无法执行这两个函数, 34 //只有调用getReadableDatebase 和getWritableDatebase时候才会调用这些方法 35 @Override 36 public void onCreate(SQLiteDatabase db) { 37 // TODO Auto-generated method stub 38 System.out.println("create a datebase"); 39 //db.execSQL("create table user(id int,name verchar(20))"); 40 db.execSQL("create table user(id int,name verchar(20),password int)");//数据库db执行数据库语句 41 } 42 //当更新这张表时候,要更改scheme version 即模式版本,不然无法更新 43 //Called when the database needs to be upgraded. 44 //The implementation should use this method to drop tables, 45 //add tables, or do anything else it needs to upgrade to the new schema version 46 @Override 47 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 48 // TODO Auto-generated method stub 49 System.out.println("onUpgrade a datebase"); 50 } 51 }
sqlite.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/createButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="create" /> <Button android:id="@+id/upgradeButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="upgrade" /> <Button android:id="@+id/insertButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="insert" /> <Button android:id="@+id/updateRecordButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="updateRecord" /> <Button android:id="@+id/queryButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="queryButton" /> </LinearLayout>
在Android中可以使用Eclipse插件DDMS来查看,也可以使用Android工具包中的adb工具来查看。android项目中的sqlite数据库位于/data/data/项目包/databases中。http://www.cnblogs.com/walkingp/archive/2011/03/28/1997437.html
1、首先打开android项目的调试模式,然后找到显示DDMS:
2、切换到DDMS,显示File Explorer窗口,找到/data/data/
使用 adb 命令访问
这里用 adb shell进入 相当于在linux下操作, 用到的命令有 ls ,ls -l,cd,sqlite3 关于linux命令可以参考博客
select * from user 表格的名字是user,而不是mars_db_test是数据库的名字
部分代码解释:
1, 一开始卡在更新数据操作的地方,执行更新数据按钮的时候一直报错,后来才搞明白,第一次创建时候数据库版本是1,执行upgradeListener后,数据库已经升级了,和原来版本为1的不是同一个数据库,所以在执行updataListener时候,也要执行如下代码
1 DatebaseHelper dbHelper=new DatebaseHelper(SQLiteActivity.this,"mars_db_test2",2); 2 SQLiteDatabase db=dbHelper.getReadableDatabase();
必须表示为2,因为版本号只可以递增,不写就递减了,就会报错。
2,关于updateListener里的update()
关于SQLiteHelper抽象类 在DatabaseHelper.java中 类DatabaseHelper继承了它 必须复写onCreate()和 onUpgrade()方法 同时必须要完成构造函数,将 Activity和要创建的数据库名传入改助手类,相当于将 Activity和数据库绑定起来
在Activity中实例化助手类,然后通过创建助手类得到可读或者可写的数据库对象SQLiteDatabase db。