每日一学之Android数据存储SQLite数据库

Posted 进击的Java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一学之Android数据存储SQLite数据库相关的知识,希望对你有一定的参考价值。

每日一学之Android数据存储(二)SQLite数据库

图片来自于百度图片



android中的数据库


Android 提供了对 SQLite数据库的完全支持,应用中的任何类(不包括应用外部的类)均可按名称访问您所创建的任何数据库。


创建SQLite数据库的两种方式


  • 在外部创建好,然后放入raw或者assets文件夹中

  • SQLiteOpenHelper onCreate()函数中创建数据库,onCreate()只会在发现没有数据库的时候执行,也就说只会执行一次。


在实际的项目开发中,一般不会在代码中创建数据库,有些临时表单除外。总是先创建好数据库和表单,放入raw文件中,在项目启动的时候,将数据库拷贝放入/data/data/your packageName/xx.db,供SQLiteOpenHelper 使用。



使用已存在数据库


SQLiteOpenHelper 中创建数据库后,数据库的路径及文件会自动绑定到Helper上,因此已经避免了一些在开发中的坑。但是我们在实际的使用中都是先创建好数据库,并存放到raw中,所以在此我们说一说怎么读取raw下已经有的数据库文件。


读取raw下数据库文件


void initDataBase(){    
   String packageName = getPackageName();    Log.i(TAG , "项目包名:" + packageName);    File file = new File(getFilesDir().getParent()+"/databases/");    Log.i(TAG , file.getPath() + " 数据库文件是否存在:" + file.exists());    
   if(!file.exists()) {        file.mkdir();    }    
  //这里的数据库文件名称一定不要有后缀
   File file2 = new File(file.getPath()+"/test");    
       if
(!file2.exists()){        try {            file2.createNewFile();        } catch (IOException e) {            e.printStackTrace();        }    }    InputStream is = getResources().openRawResource(R.raw.test);    try {        int i = 0;        OutputStream os = new FileOutputStream(file2);        
       while((i = is.read()) != -1){            os.write((byte)i);        }        os.flush();        os.close();        is.close();    } catch (FileNotFoundException e) {        e.printStackTrace();    } catch (IOException e) {        e.printStackTrace();    } }

注意:在将数据库拷贝到/data/user/0/your packageName/databases/下的时候,数据库一定不要带后缀
错误例子:/data/user/0/your packageName/databases/test.db
正确示例:/data/user/0/your packageName/databases/test
/data/user/0 == 所谓的/data/data/


实现SQLiteOpenHelper


public class mysqlitehelper extends SQLiteOpenHelper {    
   String TAG ="mydatastydy";    private static final int DATABASE_VERSION = 2;    private static final String DICTIONARY_TABLE_NAME = "dictionary";    private static final String DATABASE_NAME = "test";    private static final String DICTIONARY_TABLE_CREATE =            
       "CREATE TABLE " + DICTIONARY_TABLE_NAME + " (" +
                           "loginName TEXT, " +      
                            "UserName TEXT );";    public MySQLitehelper(Context context) {        super(context, DATABASE_NAME, null, DATABASE_VERSION);    }    @Override    public void onCreate(SQLiteDatabase db) {                        Log.i(TAG , "数据库的路径为"+db.getPath());            
          //如果未创建数据库,执行数据库创建语句            //db.execSQL(DICTIONARY_TABLE_CREATE);    }
   //数据库更新后,触发此函数          @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {    } }

注意:这里注意onCreate函数,此函数只有在指定路径下(/data/user/0/your packageName/databases/)无数据库,才执行,且只会执行一次


实现SQLiteOpenHelper


MySQLitehelper mh = new MySQLitehelper(this);

Cursor cursor = mh.getReadableDatabase().rawQuery("select * from user" , null);
while (cursor.moveToNext()) {   Log.i(TAG , "原用户名称: "+cursor.getString(cursor.getColumnIndex("userName"))); } SQLiteDatabase sd = mh.getWritableDatabase(); sd.execSQL("update user set userName = ? where loginName = ?" ,
new String[]{"test" , "18326525417"}); cursor = mh.getReadableDatabase().rawQuery("select * from user" , null);
while
(cursor.moveToNext()) {    Log.i(TAG , "更新后用户名称: "+cursor.getString(cursor.getColumnIndex("userName"))); } ContentValues values = new ContentValues(); values.put("loginName", "16585458747"); values.put("userName", "test2"); sd.insert("user" , null , values); cursor = mh.getReadableDatabase().rawQuery("select * from user" , null);
while
(cursor.moveToNext()) {    Log.i(TAG , "新增后用户名称: "+cursor.getString(cursor.getColumnIndex("userName"))); } sd.execSQL("delete from user where loginName = ?" ,
new String[]{"16585458747"}); cursor = mh.getReadableDatabase().rawQuery("select * from user" , null);
while (cursor.moveToNext()) {    Log.i(TAG , "删除用户名称: "+cursor.getString(cursor.getColumnIndex("userName"))); } cursor.close(); sd.close();

当然常用增、删、改、查函数在Android中都提供了多种方式,由个人的喜好决定,条条大路通罗马。


下期提要


下期开始我们将进入Android中的通知和广播功能,敬请期待!



每日一学之Android数据存储(二)SQLite数据库

每日一学之Android数据存储(二)SQLite数据库

可了解更多编程方面的知识,

让你看到每天一点点的进步。

谢谢点赞 + 分享!!!!!!


不积跬步,无以至千里;

不积小流,无以成江海。

以上是关于每日一学之Android数据存储SQLite数据库的主要内容,如果未能解决你的问题,请参考以下文章

每日一学之认识Spring中的AOP

每日一学之Java开发技巧正则表达式

Python每日一练——数据存储第五关:操作SQLite数据库

[每日一学]apache camel简介

每日一学数据仓库之全量表增量表拉链表流水表

每日一学--深究字节与字符