我的Android六章:Android中SQLite数据库操作
今天学习的内容是Android中的SQLite数据库操作,在讲解这个内容之前小编在前面有一篇博客也是讲解了SQLite数据库的操作,而那篇博客的讲解是讲述了
如何在Window中通过DOM来操作数据库了,如果没有看的同学可以点击一下看看,而这次讲解的是如何通过Android中提供的类来对数据库进行操作
在讲解这个知识点之前我们要列举今天笔记目录,这样也许你看到我的博客就知道我在讲解什么了,同时在移动端的数据保存不当当读写在数据库中,而有时候我们也会对文件
或者有一下XML进行我们的数据存储,我会重文件读写开始然后再到数据的操作,这样我们就能够对Android中数据存储操作有个大概的了解
目录
Android中三种存储方式
1.文件存储:
核心:通过Context类获得openFileInput()和opendFileOutput()之后通过文件流的方式读写数据操作
两个方法的参数
参数1:指定要传入的数据格式:"data"
参数2:指定要操作的模式.MODE_PRIVATE和MODE_APPEND
MODE_PRIVATE:是默认模式,当你指定同样的文件名的时候,所写入的数据将会覆盖源文件的内容
MODE_APPEND:而如果文件以存在则会追加原有文件的内容,不存在着创建新的文件
2.SharedPreference存储
要通过SharedPreference方式操作数据存储则必须活动SharedPreference对象,获取该对象的方式有三种形式
1.Context.getSharedPreference():
2.Actvity类中的getPrerence()
3.PreferenceManager类中的getDefaultSharedPreference()
获取SharedPreference对象之后通过.edit()方法来获得一个SharedPreference.Editor对象
然后调用对象中的put方法 然后调用commit()方法则实现数据存储操作
3.数据库存储
认识SQLiteOpenHelper辅助类:借助这个类可以进行数据库创建和升级
1.SQLiteOpenHelper是一个抽象类,如果要使用的话则需要通过一个类来继承它,然后重写该类中的onCreate()和onUpgrade()方法
2.如果要创建一个数据库着需要调用getReadableDatabase()和getWriteableDatabase(),如果数据库存在着打开,如果不存在着创建一个新数据库 ,
注意,当数据库不可写入时(磁盘空间已满)getReadableDatabase()方法返回的对象将对只读方式打开数据库,而getWriteableDatabase()则会报异常
以上是小编大致列举这篇博客的目录内容,这样好让大家能够明白原来在Android中不往往通过数据库来存放数据的,起码我们要会对文件的读写要有定的认识,那赶紧进入我们学习的内容吧
1.文件存储:
相信大家学习过java的同学对java中的文件输入输出流有大致的认识了,也熟悉的运用过进行文件的读写操作,那在Android中也是同样如此,可以通过输入输出流对我们的文件进行读写操作
1.我们新建一个Android工程,这是必须的
我们通过文件存储方式实现登录保存用户帐号和密码的操作
新建工程完毕之后我们
1.打开我们的layout--->activity_main 布局文件添加两个EditeView控件,并且指定一个唯一Id,一会我们要引用该控件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.filewriteandread.MainActivity"
android:orientation="vertical" > <EditText
android:id="@+id/ed_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入帐号..."
/> <EditText
android:id="@+id/ed_pass"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:password="true"
android:hint="请输入密码..."
/> <Button
android:id="@+id/btn1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="登录"
/>
</LinearLayout>
2.编写我们的控件代码 MainActivity.java 获取我们的控件对象
package com.example.filewriteandread; import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader; import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText; public class MainActivity extends Activity{ private Button btn1 ;
private EditText ed_name ;
private EditText ed_pass ; //定义一个文件输入流对象
FileOutputStream out = null ;
FileInputStream input = null ;
BufferedReader read = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ed_name =(EditText)findViewById(R.id.ed_name);
ed_pass = (EditText)findViewById(R.id.ed_pass); btn1 = (Button)findViewById(R.id.btn1);
} }
3.给登录按钮绑定一个监听事件,当我们点击该登录操作时就实现数据的保存操作
btn1.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
String name = ed_name.getText().toString() ;
String pass = ed_pass.getText().toString() ;
try {
out = MainActivity.this.openFileOutput("data", MODE_PRIVATE); out.write((name+"##"+pass).getBytes()) ; } catch (Exception e) {
e.printStackTrace();
}finally{
try {
out.close();
} catch (IOException e) {e.printStackTrace();}
}
}
});
openFileOutput("文件名",默认读写形式);
在这里你会看到我不是直接通过new FileOupStream去获取使用文件输出流对象,而是通过上下文对(Activity)来获得的,所以以后想要获得一个输入输出对则可以
通过Context类的openFileInput()和opendFileOutput()方法获得流对象,之后通过文件流的方式读写数据操作
执行以上代码运行,打开DDMS 你会看到你的工程目录下会多一个文件
接下来是读数据了,将读到的数据保存到编辑组件中,我们编写一个readDate()方法,同样通过Context类的openFileInput()获得流对象,之后通过文件流的方式读写数据操作‘
public void readData(){
FileInputStream input =null;
BufferedReader read = null;
try { input = this.openFileInput("data");
if(input!=null){
//获取一个字符流对象
read = new BufferedReader(new InputStreamReader(input));
String[] str = read.readLine().split("##");
ed_name.setText(str[0]);
ed_pass.setText(str[1]); } } catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
input.close() ;
read.close();
} catch (IOException e) {e.printStackTrace();}
} }
3.编译运行
package com.example.filewriteandread; import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader; import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText; public class MainActivity extends Activity{ private Button btn1 ;
private EditText ed_name ;
private EditText ed_pass ; //定义一个文件输入流对象
FileOutputStream out = null ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); ed_name =(EditText)findViewById(R.id.ed_name);
ed_pass = (EditText)findViewById(R.id.ed_pass);
readData();
btn1 = (Button)findViewById(R.id.btn1);
btn1.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
String name = ed_name.getText().toString() ;
String pass = ed_pass.getText().toString() ;
try {
out = MainActivity.this.openFileOutput("data", MODE_PRIVATE); out.write((name+"##"+pass).getBytes()) ; } catch (Exception e) {
e.printStackTrace();
}finally{
try {
out.close();
} catch (IOException e) {e.printStackTrace();}
}
}
}); } public void readData(){
FileInputStream input =null;
BufferedReader read = null;
try {
input = this.openFileInput("data");
if(input!=null){
//获取一个字符流对象
read = new BufferedReader(new InputStreamReader(input));
String[] str = read.readLine().split("##");
ed_name.setText(str[0]);
ed_pass.setText(str[1]); } } catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
input.close() ;
read.close();
} catch (IOException e) {e.printStackTrace();}
} } }
2.SharedPreference存储方式
其实这种方式和文件存放方式操作一样,只是它生成的文件格式是XMl形式的,往往是以键值对的形式存放数据,我新建一个工程给大家演示一下
这次操作我们就不学匿名内部类的形式了,而这次我写内部类的形式,这样大家就可以知道其实内部类在安卓中运用可多了,内部类有好几种,如果想知道的同学也可以查看一下我的博客内部类的讲解
接下来我定义一个内部类,代码编写如下
class MyBtnListener implements OnClickListener{ @Override
public void onClick(View v) {
//获取文本的值
String text1 = ed_test1.getText().toString();
String text2 = ed_test2.getText().toString(); SharedPreferences sharePref = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
SharedPreferences.Editor editor = sharePref.edit() ; editor.putString("text1",text1) ;
editor.putString("text2",text2) ;
editor.commit() ;
} }
首先我是通过
PreferenceManager.getDefaultSharedPreferences(MainActivity.this)获取SharedPreferences对象的获取SharedPreferences对象其实不当当这一种,在目录中我也告诉其他几种获取的方式
大家可以尝试一下
再然后我是通过该 对象.edit()获取的SharedPreferences.Editor对象的,这个对象作用相当我们的数据库中JDBC的statement语句对象,用于对数据的封装操作的提供了相应的putXX方法
用于封装不同类型的数据,然后封装完数据后一定要记住要提交事务操作
完整代码如下
package com.example.filewriteandread2; import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText; public class MainActivity extends Activity { private EditText ed_test1;
private EditText ed_test2;
private Button btn1 ; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ed_test1 = (EditText)findViewById(R.id.ed_test1);
ed_test2 = (EditText)findViewById(R.id.ed_test2);
btn1 = (Button)findViewById(R.id.btn_1);
btn1.setOnClickListener(new MyBtnListener()); } class MyBtnListener implements OnClickListener{ @Override
public void onClick(View v) {
//获取文本的值
String text1 = ed_test1.getText().toString();
String text2 = ed_test2.getText().toString(); SharedPreferences sharePref = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
SharedPreferences.Editor editor = sharePref.edit() ; editor.putString("text1",text1) ;
editor.putString("text2",text2) ;
editor.commit() ;
} }
}
接下来我们打开DDMS查看一个我们封装的数据
我们导出该文件查询一下,可以点击上面这个按钮哦!
是不是很6呢?哈哈,有同学会问既然能存放这样的数据,那读数据会不会很麻烦呢??其实不然,读数据还简单哦,可以通过PreferenceManager类中的getXXX方法获取哦!
这次我添加一个按钮控件,当你点击按钮操作获得该文件的数据,我们实现一下吧
<Button
android:id="@+id/btn_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="获得数据"
android:onClick="getSomeData"
/>
完整代码如下:
package com.example.filewriteandread2; import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast; public class MainActivity extends Activity { private EditText ed_test1;
private EditText ed_test2;
private Button btn1 ; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ed_test1 = (EditText)findViewById(R.id.ed_test1);
ed_test2 = (EditText)findViewById(R.id.ed_test2);
btn1 = (Button)findViewById(R.id.btn_1);
btn1.setOnClickListener(new MyBtnListener()); } class MyBtnListener implements OnClickListener{ @Override
public void onClick(View v) {
//获取文本的值
String text1 = ed_test1.getText().toString();
String text2 = ed_test2.getText().toString(); //获取SharedPreferences对象
SharedPreferences sharePref = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
SharedPreferences.Editor editor = sharePref.edit() ; editor.putString("text1",text1) ;
editor.putString("text2",text2) ;
editor.commit() ;
} } public void getSomeData(View v){
//获取SharedPreferences对象
SharedPreferences sharePref2 = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
Toast.makeText(this,sharePref2.getString("text1", "") +"---" + sharePref2.getString("text2", ""), Toast.LENGTH_SHORT).show();
} }
好了,以上就是通过文件进行数据的读写操作了,做了那么多操作,是不是很方便呢?
接下来给大家讲解的就是如何在Android中通过提供的类进行操作数据库了
3.数据库存储
我想大家务必已经对SQLite已经有大致的认识和我在Java中学习的MySQL,Oracle等关系型数据库没什么不同,唯一不同的是它的数据类型,在这小编大致列举几个数据类型有关SQLite的基础学习可以
到菜鸟教程官网进行学习,这样会帮助你更好的了解该知识内容
integer数值型 real浮点类型 blod二进制类型 text文本类型
接下来我要介绍一下实现的步骤啦
1认识SQLiteOpenHelper辅助类:借助这个类可以进行数据库创建和升级
2.SQLiteOpenHelper是一个抽象类,如果要使用的话则需要通过一个类来继承它,然后重写该类中的onCreate()和onUpgrade()方法
3.如果要创建一个数据库着需要调用getReadableDatabase()和getWriteableDatabase(),如果数据库存在着打开,如果不存在着创建一个新数据库 ,
1.定义步骤我们编写一个类型来继承这个辅助类通过重写辅助类的onCreate() onUpgrade()方法实现创建和升级操作
package com.example.databaseoperation; import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast; public class MyDatabaseHelper extends SQLiteOpenHelper { public static final String CREATE_BOOK ="create table Book ("
+"id integer primary key autoincrement, "
+"bname text,"
+"authod text, "
+"price real, "
+"pages integer)"; private Context mContext ; public MyDatabaseHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
this.mContext = context ;
} @Override
public void onCreate(SQLiteDatabase db) {
System.out.println(CREATE_BOOK);
db.execSQL(CREATE_BOOK);
//创建成功后提示
Toast.makeText(mContext, "数据库和数据库表创建成功",Toast.LENGTH_SHORT).show() ;
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
解读一下以上代码:第一:我们通过定义一个普通类来继承SQLiteOpenHelper 这个赋值类,然后重写该类中onCreate()和onUpgrade()方法,同时编写一个构造方法用于获得上下文对象,已经传入的要创建的数据库名,和数据库创建的版本号,这样我们就可以创建数据库了,同时创建了一张Book表
2.在MainActivity中调用操作
//点击时创建数据库操作
btn_create.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
MyDatabaseHelper bHelper = new MyDatabaseHelper(this,"book.db",null,1);
dbHelper.getWritableDatabase() ;
} });
绑定一个按钮,通过点击按钮则创建数据库
这时候我们就可以通过DOM命令来查询一下我们自己新建的数据库以及表是否存在
我们通过DOM进入该数据查看一下
好接下来我们给该数据库添加数据操作
通过SQLiteDatabase.insert()方法可以添加数据到数据库
//单击添加按钮时去到添加活动中
btn_add.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues() ;
values.put("bname", "This my first Code");
values.put("authod", "yangA");
values.put("price", 30.0);
values.put("pages",3000);
db.insert("book", null, values);
values.clear(); values.put("bname", "This my second Code");
values.put("authod", "yangB");
values.put("price", 40.0);
values.put("pages",1000);
db.insert("book", null, values);
Toast.makeText(DataBaseActivity.this, "添加完毕", Toast.LENGTH_SHORT).show(); } });
通过一个ContentValues对象进行数据封装然后在执行添加操作也是通过键值的形式存放数据然后变量添加操作
点击添加成功我们可以查询一下数据是否成功添加进去
SQLiteDatabase也提供了相应的updata(),delete() 方法这些方法操作也是非常简单,小编就不再这里演示了,希望大家尝试一下吧,这次的讲解介绍完毕了,下一章将会深入探讨Android中的SQLite操作
敬请期待哦
我的Android六章:Android中SQLite数据库操作的更多相关文章
- Android中SQLite数据库操作(1)——使用SQL语句操作SQLite数据库
下面是最原始的方法,用SQL语句操作数据库.后面的"Android中SQLite数据库操作(2)--SQLiteOpenHelper类"将介绍一种常用的android封装操作SQL ...
- iOS 中SQLite数据库操作
在iOS中实现SQLite数据库的操作:1.导入框架(libsqlite3.0.tbd) 2.导入头文件<sqlite3.h> 3.实现数据的增删改查 实现简单 SQLite数据库操作 的 ...
- Android中SQLite数据库操作(2)——SQLiteOpenHelper类
如果开发者对SQL语法不熟悉,我要告诉你一个好消息,Android提供了一个SQLiteOpenHelper类. 在实际项目中很少使用SQLiteDatabase的方法(请看:http://blog. ...
- Android内部自带的SQLite数据库操作dos命令
1:什么叫做SQLite数据库 Android系统内核是Linux系统,Android系统很特殊,他自带了一个SQLite数据库,轻量型的一款嵌入式的数据库 它占用资源非常的低,在嵌入式设备中,可能只 ...
- Android中SQLite数据库操作(2)——使用SQLiteDatabase提供的方法操作数据库
如果开发者对SQL语法不熟,甚至以前从未使用过任何数据库,Android的SQLiteDatabase提供了insert.update.delete或query语句来操作数据库. 一.insert方法 ...
- Android群英传》读书笔记 (3) 第六章 Android绘图机制与处理技巧 + 第七章 Android动画机制与使用技巧
第六章 Android绘图机制与处理技巧 1.屏幕尺寸信息屏幕大小:屏幕对角线长度,单位“寸”:分辨率:手机屏幕像素点个数,例如720x1280分辨率:PPI(Pixels Per Inch):即DP ...
- Android 开发中 SQLite 数据库的使用
SQLite 介绍 SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能.此外它还是开源的,任何人都可以使用它.许多开源项目((Mozilla, PHP, ...
- Android中Sqlite数据库多线程并发问题
最近在做一个Android项目, 为了改善用户体验,把原先必须让用户“等待”的过程改成在新线程中异步执行.但是这样做遇到了多个线程同时需要写Sqlite数据库,导致操作数据库失败. 本人对Java并不 ...
- android中的数据库操作(SQLite)
android中的数据库操作 android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作. 一.android内的数据库的基础知识介绍 1.用了什么数据库 an ...
随机推荐
- chrome dev debug network 的timeline说明
在使用chrome的时候F12的开发者工具中有个network,其中对每个请求有个timeline的说明,当鼠标放上去会有下面的显示: 这里面的几个指标在说明在chrome使用文档有说明: 下面我用人 ...
- MVC之前的那点事儿系列(6):动态注册HttpModule
文章内容 通过前面的章节,我们知道HttpApplication在初始化的时候会初始化所有配置文件里注册的HttpModules,那么有一个疑问,能否初始化之前动态加载HttpModule,而不是只从 ...
- C#--参数数组
- C#基础02
学习"传智播客视频基础"做的课堂笔记,您有幸读到,若其中有错误部分,请您务必指明.另外请给出您的宝贵建议,谢谢. **************基础知识************ 1: ...
- web前端学习笔记---scrollWidth,clientWidth,offsetWidth的区别
通过一个demo测试这三个属性的差别. 说明: scrollWidth:对象的实际内容的宽度,不包边线宽度,会随对象中内容超过可视区后而变大. clientWidth:对象内容的可视区的宽度,不包滚动 ...
- .Net在线付款---Paypal在线付款开发过程
原文:.Net在线付款---Paypal在线付款开发过程 最近在做一个Web订单项目,项目有一个需求就是集成Paypal与Paydollar在线付款,一开始看到这个需求也是傻了眼,因为以前从来没有做过 ...
- 【Java每日一题】20161206
package Dec2016; public class Ques1206 { public static void main(String[] args){ doSex(null); } publ ...
- Eclipse常用的快捷键
Eclipse常用快捷键 1, Ctrl+S,保存文档. 2, Tab,多行同时右移:选中多行 3, shlft+tab,多行同时左移,选中多行 4, ...
- 泛函编程(34)-泛函变量:处理状态转变-ST Monad
泛函编程的核心模式就是函数组合(compositionality).实现函数组合的必要条件之一就是参与组合的各方程序都必须是纯代码的(pure code).所谓纯代码就是程序中的所有表达式都必须是Re ...
- springmvc参数绑定
1. @PathVariable当使用@RequestMapping URI template 样式映射时, 即 someUrl/{paramId}, 这时的paramId可通过 @Pathvaria ...