在 android 中有个类可方便的直接创建数据库,自己写一个类继承 SQLiteOpenHelper
package com.wangban.yzbbanban.test_mysqlite;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import android.widget.Toast;/** * Created by YZBbanban on 16/7/27. */public class MySQLiteHelper extends SQLiteOpenHelper {    private Context context;    public MySQLiteHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {        super(context, name, factory, version);        this.context = context;    }    @Override    public void onCreate(SQLiteDatabase sqLiteDatabase) {        sqLiteDatabase.execSQL("create table Book(id integer primary key autoincrement,name text,price real)");        Toast.makeText(context, "创建完成", Toast.LENGTH_SHORT).show();    }    @Override    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {    }}

代码很简单,传入一个 Context(此 Context 很重要),创建一个对象,传入参数:上下文对象,数据库文件名,游标工厂(一般不用,为 null),数据库版本号(可自定义),

重写 onCreate 的方法,方法的参数即为数据库引用,可用此引用创建数据库中的表单:exeSQL()方法创建表单数据,创建成功,Toast 提示一下,onUpgrade 表示,若版本号与之前的老版本号不一致,则执行此方法(在此不需要用)。至此一个 MySQLiteHelper类完成,用于创建数据库文件,以及表单。

现在进入正题,之前提到过构造方法的一个传入值Context,我们可以在源码中找到一个这样的类:ContextWrapper (继承自 Context)通过此类我们可以获得应用程序的资源和类,包括对Activity,Broadcast,Intent等的操做,比如 startActivity(),sendBroadcast()等,还有些设置方法,像是setWallpaper(),当然最主要是有关于数据存储的一切方法:文件存储(File),个性化存储(sharedPreferances),数据库 (SQLite)等,对于数据库的操作直接看源码:

  public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory) {        throw new RuntimeException("Stub!");    }    public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory, DatabaseErrorHandler errorHandler) {        throw new RuntimeException("Stub!");    }    public boolean moveDatabaseFrom(Context sourceContext, String name) {        throw new RuntimeException("Stub!");    }    public boolean deleteDatabase(String name) {        throw new RuntimeException("Stub!");    }    public File getDatabasePath(String name) {        throw new RuntimeException("Stub!");    }    public String[] databaseList() {        throw new RuntimeException("Stub!");    }

构造方法:

public class ContextWrapper extends Context {    public ContextWrapper(Context base) {        throw new RuntimeException("Stub!");    }

可以知道构造方法只有一个参数 Context,而且,在 SQLiteOpenHelper 中传入的 Context,也是在此调用的,其中的具体方法被SDK 隐藏了,所以看不到,只有抛出异常,但是可以了解到:所以在创建数据库时需要传入一个参数:Context, 其中getDatabasePath() 为创建数据库路径,OpenOrCreateDatebase ()为创建数据库,所以也可以确认的是,在 SQLiteOpenHelper 中的子类,调用getReadableDatabase()生成数据库文件表单时也调用了OpenOrCreateDatebase (),同样传入参数也是 Context,(只是默认路径在该程序的数据库文件夹里(data/data/~~)),所以我们只要重写了 ContextWrapper 方法,并重写其中的 OpenCreateDatebase(),与 getDatabasePath()方法即可创建所需要的数据库目录与数据库表单,下面是代码:
package com.wangban.yzbbanban.test_mysqlite;import android.content.Context;import android.content.ContextWrapper;import android.database.DatabaseErrorHandler;import android.database.sqlite.SQLiteDatabase;import android.util.Log;import java.io.File;import java.io.IOException;/** * Created by YZBbanban on 16/7/27. */public class MyContextWrapper extends ContextWrapper {    private Context mContext;    private String dirName;    /**     * 构造函数     *     * @param base     *上下文环境     */    public MyContextWrapper(Context base) {        super(base);        this.mContext = base;    }    /**     * 构造函数     * @param base     * @param dirName     */    public MyContextWrapper(Context base, String dirName) {        super(base);        this.mContext = base;        this.dirName = dirName;    }    /**     * 获得数据库路径,如果不存在,则创建对象对象     *     * @param name     */    @Override    public File getDatabasePath(String name) {        // 判断是否存在sd卡        boolean sdExist = android.os.Environment.MEDIA_MOUNTED                .equals(android.os.Environment.getExternalStorageState());        if (!sdExist) {// 如果不存在,            Log.e("SD卡管理:", "SD卡不存在,请加载SD卡");            return null;        } else {// 如果存在            // 获取sd卡路径            String dbDir = android.os.Environment.getExternalStorageDirectory()                    .getAbsolutePath();            dbDir += "/" + ((dirName == null || "".equals(dirName)) ?                    mContext.getPackageName() : dirName);// 数据库所在目录            String dbPath = dbDir + "/" + name;// 数据库路径            // 判断目录是否存在,不存在则创建该目录            File dirFile = new File(dbDir);            if (!dirFile.exists())                dirFile.mkdirs();            // 数据库文件是否创建成功            boolean isFileCreateSuccess = false;            // 判断文件是否存在,不存在则创建该文件            File dbFile = new File(dbPath);            if (!dbFile.exists()) {                try {                    isFileCreateSuccess = dbFile.createNewFile();// 创建文件                } catch (IOException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }            } else                isFileCreateSuccess = true;            // 返回数据库文件对象            if (isFileCreateSuccess)                return dbFile;            else                return null;        }    }    /**     * 重载这个方法,是用来打开SD卡上的数据库的,android 2.3及以下会调用这个方法。     *     * @param name     * @param mode     * @param factory     */    @Override    public SQLiteDatabase openOrCreateDatabase(String name, int mode,                                               SQLiteDatabase.CursorFactory factory) {        SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(                getDatabasePath(name), null);        return result;    }    /**     * Android 4.0会调用此方法获取数据库。     *     * @see android.content.ContextWrapper#openOrCreateDatabase(java.lang.String,     *  int, android.database.sqlite.SQLiteDatabase.CursorFactory,     *  android.database.DatabaseErrorHandler)     * @param name     * @param mode     * @param factory     * @param errorHandler     */    @Override    public SQLiteDatabase openOrCreateDatabase(String name, int mode,                                               SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler) {        SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(                getDatabasePath(name), null);        return result;    }}
在 Activity 中创建 MySQLiteHelper()对象,并使用新的 Context 对象传入MySQLiteHelper的 onCreate() 方法中即可,下面是 Activity 代码:
package com.wangban.yzbbanban.test_mysqlite;import android.database.sqlite.SQLiteDatabase;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;public class MainActivity extends AppCompatActivity {    private Button btnCreate;    private MySQLiteHelper helper;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        btnCreate = (Button) findViewById(R.id.btn_create);        MyContextWrapper mContext = new MyContextWrapper(this, "Run");        helper = new MySQLiteHelper(mContext, "Book.db", null, 2);        setListeners();    }    private void setListeners() {        btnCreate.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                SQLiteDatabase db = helper.getWritableDatabase();            }        });    }}
布局文件:

<?xml version="1.0" encoding="utf-8"?>        


更多相关文章

  1. 使用反射获取Android中隐藏的方法
  2. android 按钮效果的两种实现方法
  3. Android设置桌面背景图片的方法
  4. [置顶] 找到一个在Android上创建阻塞式模态对话框的方法
  5. Android来电拦截的实现方法
  6. Android Studio集成Library时报错,终极解决方法
  7. Android从服务器获取图片的实例方法
  8. android屏幕休眠和唤醒两种方法(newWakeLock)

随机推荐

  1. ANDROID中SHAPE的使用
  2. android 捕获返回(后退)按钮事件的两种方法
  3. android操作excel
  4. 【android开发】android操作文件
  5. ANDROID GRIDVIEW 点击某个位置获取某个
  6. ubuntu 不是 识别 android 设备 解决方法
  7. android圆角dialog,并限制宽度和高度
  8. Android4.1 Rotation 小结
  9. android传感器类别
  10. android 软键盘自动弹出和关闭