安卓的数据存储有几种方式,其中SQLite数据库存储是最重要的,今天上午特地花了时间去学习,略有心得,来自我总结下,大神指正。
首先当然还是介绍两个类(= = 好像我都喜欢这样开头)
SQLiteOpenHelper:可以说是最先用到的类了,顾名思义,打开数据库的好帮手,哈哈
SQLiteDatabase:这个可以直观理解为特定数据库的管理者,有了它,就能任意所了!
接下来介绍类的几个方法:
SQLiteOpenHelper:
有两个主要打开的方法,一个是getReadableDatabase()和getWritableDatabase(),这两个方法的共同点是可以创建一个或者打开一个现有的数据库,并返回一个可以对数据库进行操作的对象(就是我说的管理员).而区别就是,当数据库不可以写入的时候(磁盘满)getReadableDatabase()方法是以只读方式去打开,而另个方法就会出现异常。
还有三个重写方法:一个是构造函数,一个是oncreate方法,一个是onUpgrade方法,其中构造函数是为了在初始化时,参数传入新建数据库的对象,是为了关联数据库,onCreate方法是在里面执行execSQL语句建表而用,而onUpgrade方法是更新表或者表数据的方法,成为数据库升级。
SQLiteDatabase:
有数据库的各种操作方法,再加上一种执行数据库语句的方法。
create: 很简单的方法,用SQLiteOpenHelper好帮手类的对象执行getWritableDatabase
方法,就可以触发SQLiteOpenHelper类下的onCreate方法,即创建一个数据库
<span style="font-size:24px;"></span><pre name="code" class="java">dbhelper.getWritableDatabase();//这里的dbhelper是SQLiteOpenHelper对象 Toast.makeText(this,"create is succeessful",Toast.LENGTH_SHORT).show();
delete: 这个方法比较简单,传入三个参数,表名,列名,约束条件。
SQLiteDatabase db1 = dbhelper.getWritableDatabase(); db1.delete("Book", "name", new String[]{"zhongyan"}); Toast.makeText(this,"delete is succeessful",Toast.LENGTH_SHORT).show();
insert: 这里介绍个类ContentValues,我把它叫做内容信息八卦,哈哈,其实就是把所有 的信息数据放在这个类的对象里,然后一窝蜂把它存进去,这个ContentValues 类对象,是通过键值对存放的,也就是数据库一个列名对应一个数据。最后再用
insert(表名,默认值,内容信息对象)执行下就OK啦~
SQLiteDatabase db = dbhelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name","my code"); values.put("pages","1000"); values.put("author","zhongyan"); values.put("price", "36"); db.insert("Book", null, values); Toast.makeText(this,"insert is succeessful",Toast.LENGTH_SHORT).show();
querry: 需要介绍个类Cursor,我觉得它是个用来缓存数据库查询后出来的数据的东东, 当SQLiteDatabase对象执行querry方法时,就会返回Cursor对象,其中querry 方法需要传入8个参数= = ,好多,都是有关数据库表名,列名,约束等,下面 贴出详细介绍。
而Cursor对象里面的数据,则是用最常用的遍历手法,一个一个的拿出来就可 以了,这里用的是类似指针的方法。
SQLiteDatabase db2 = dbhelper.getWritableDatabase();Cursor cursor=db2.query("Book",null,null,null,null,null,null,null); if (cursor.moveToFirst()){ //把指针放到cursor对象首地址 do{ String name = cursor.getString(cursor.getColumnIndex("name")); String author = cursor.getString(cursor.getColumnIndex("author")); int pages = cursor.getInt(cursor.getColumnIndex("pages")); double price = cursor.getDouble(cursor.getColumnIndex("price")); }while(cursor.moveToLast()); //直到最后才结束 }
execSQL:没有什么特别的,里面就是写数据库操作语句,你可以先把语句封装,在传入常量参数进去执行,也可以直接在里面写语句,看个人喜好。
这是全部代码,仅供参考:
首先是mainactivity类
然后是MyDatabaseHelper类public class MainActivity extends AppCompatActivity implements View.OnClickListener{ private MyDatabaseHelper dbhelper; private Button bu_crea,bu_upda,bu_inser,bu_dele,bu_quer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); dbhelper = new MyDatabaseHelper(this,"BookStore.db",null,2); findid(); } private void findid() { bu_crea = (Button) findViewById(R.id.bu_update); bu_inser = (Button) findViewById(R.id.bu_insert); bu_quer = (Button) findViewById(R.id.bu_querry); bu_quer.setOnClickListener(this); bu_crea.setOnClickListener(this); bu_inser.setOnClickListener(this); bu_dele.setOnClickListener(this); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.bu_create: dbhelper.getWritableDatabase(); Toast.makeText(this,"create is succeessful",Toast.LENGTH_SHORT).show(); break; case R.id.bu_insert: SQLiteDatabase db = dbhelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name","my code"); values.put("pages","1000"); values.put("author","zhongyan"); values.put("price", "36"); db.insert("Book", null, values); Toast.makeText(this,"insert is succeessful",Toast.LENGTH_SHORT).show(); break; case R.id.bu_delete: SQLiteDatabase db1 = dbhelper.getWritableDatabase(); db1.delete("Book", "name", new String[]{"zhongyan"}); Toast.makeText(this,"delete is succeessful",Toast.LENGTH_SHORT).show(); break; case R.id.bu_querry: SQLiteDatabase db2 = dbhelper.getWritableDatabase(); Cursor cursor=db2.query("Book",null,null,null,null,null,null,null); if (cursor.moveToFirst()){ do{ String name = cursor.getString(cursor.getColumnIndex("name")); String author = cursor.getString(cursor.getColumnIndex("author")); int pages = cursor.getInt(cursor.getColumnIndex("pages")); double price = cursor.getDouble(cursor.getColumnIndex("price")); }while(cursor.moveToLast()); } } } }
public class MyDatabaseHelper extends SQLiteOpenHelper { private Context mcontext; private static final String CREATE_BOOK="create table book(" + "id integer primary key autoincrement" + "author text" + "price real" + "pages integer" + "name text)"; public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); mcontext=context; } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_BOOK); Toast.makeText(mcontext,"create successed",Toast.LENGTH_SHORT).show(); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }