• 我的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操作

    敬请期待哦

      

            

     

  • 相关阅读:
    .NET 4.5 异步IO
    使用MANIFEST.MF文件来track War包做持续部署
    .NET 4.5 压缩
    自定义实现URL重写 04.18
    对.Net Framework的认识
    那点所谓的分布式——memcache
    不能选择FreeTextBox下拉列表框
    实战架构设计
    LoadRunner压力测试心得总结
    JavaScript的模块化:封装(闭包),继承(原型)
  • 原文地址:https://www.cnblogs.com/xiaotaojing/p/6090005.html
Copyright © 2020-2023  润新知