MyOpenHelper openHelper = new MyOpenHelper(this);
类似于java的File file = new File();只是声明这个东西,但是文件还并没有真正的被创建出来。那么怎么可以创建出一个数据库呢?
SQLiteDatabase getReadableDatabase() Create and/or open a database.
获得一个可读的数据库。
SQLiteDatabase getWritableDatabase() Create and/or open a database that will be used for reading and writing.
获得一个可写的数据库。
还是getReadableDatabase()更靠谱一些,当磁盘满了的时候,getWritableDatabase()会直接挂掉但是getReadableDatabase()会给你返回一个只读的数据库。所以大部分情况用getReadableDatabase()还是比较安全的。大多部分情况它们俩功能一样没什么区别,只不过在磁盘满了的时候一个会返回只读的数据库而另一个会直接挂掉。
Ctrl+1补全左边。
SQLiteDatabase可以执行SQL,执行SQL就可以修改/查询数据库里面的内容。
[2017-06-17 07:54:09] Failed to pull selection
[2017-06-17 07:54:09] null
拽取文件失败
只能使用adb命令来拽取文件了。
通过getReadableDatabase()或者是getWritableDatabase()就可以把这个数据库文件创建起来,创建的时候它会走onCreate()方法.在onCreate()方法里面我们可以做表结构的初始化。
@Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub //数据库第一次创建的时候就会调用onCreate //当数据库文件第一次创建的时候 会调用这个方法 在这个方法中 我们一般做表结构的创建和数据的初始化操作 //能够跟关系型的数据库/SQLite的数据库进行操作的API就是SQLiteDatabase //_id sqlite id这一列的字段名 一般都习惯称为_id //sqlite数据库 都是字符串 存的时候没做数据类型的区分 都是用字符串存储的 //写SQL语句也要按照标准的格式来。这么写是没有问题的,只不过存的时候都是用字符串存。比如说去取某一个数据,比如说getString()、getInt(),它在取的时候根据你调哪一个方法再把 //这个字符串转化成相应的数据类型。这样就方便它底层的数据结构简单一些,存的都是字符串。 db.execSQL("create table info(_id integer primary key autoincrement,name varchar(20),phone varchar(20))"); System.out.println("onCreate被调用"); }
package com.itheima.sqlitehello; import android.os.Bundle; import android.app.Activity; import android.database.sqlite.SQLiteDatabase; import android.view.Menu; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MyOpenHelper openHelper = new MyOpenHelper(this); //getReadableDatabase 和 getWriteableDatabase在大部分情况下作用是相同的: //创建(数据库文件不存在的时候)或者打开一个数据库 获得的都是可读可写的数据库 //当磁盘满的时候 getReadableDatabase会返回一个只读的数据库 //getWritableDatabase会出错 SQLiteDatabase readableDatabase = openHelper.getReadableDatabase(); SQLiteDatabase writableDatabase = openHelper.getWritableDatabase(); } }
package com.itheima.sqlitehello; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; public class MyOpenHelper extends SQLiteOpenHelper { /*public MyOpenHelper(Context context, String name, CursorFactory factory, int version) {*/ public MyOpenHelper(Context context){ //第一个参数上下文 //第二个参数 数据库的名字 如果传入null 就是在内存中创建一个数据库 内存中的数据库在应用退出之后 数据就会丢失 //如果是聊天记录之类我真正的想给它存起来,下一次再启动还想用那你就要给它存储到一个具体的数据库里面。这个名字就一定要传进来 //第三个参数 游标工厂 如果使用系统默认的游标工厂就传入null //第四个参数 数据库的版本号 用版本号来控制数据库的升级和降级 版本号从1开始 super(context, "itheima.db", null, 1); // TODO Auto-generated constructor stub } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub //数据库第一次创建的时候就会调用onCreate //当数据库文件第一次创建的时候 会调用这个方法 在这个方法中 我们一般做表结构的创建和数据的初始化操作 //能够跟关系型的数据库/SQLite的数据库进行操作的API就是SQLiteDatabase //_id sqlite id这一列的字段名 一般都习惯称为_id //sqlite数据库 都是字符串 存的时候没做数据类型的区分 都是用字符串存储的 //写SQL语句也要按照标准的格式来。这么写是没有问题的,只不过存的时候都是用字符串存。比如说去取某一个数据,比如说getString()、getInt(),它在取的时候根据你调哪一个方法再把 //这个字符串转化成相应的数据类型。这样就方便它底层的数据结构简单一些,存的都是字符串。 db.execSQL("create table info(_id integer primary key autoincrement,name varchar(20),phone varchar(20))"); System.out.println("onCreate被调用"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub } }