Android 操作数据库Sqlite,数据写入到SD卡里面

Android 本身有自带的数据库,不需要安装,本身就已经添加到库里面,我们只需要引入库文件,就能够操作,对于数据量比较少的应用是个比较好的选择。

对于Sqlite的操作,我们需要实例化SQLiteOpenHelper类,这是一个抽象类,必须要实例化,需要实现的方法有onCreate和onUpgrade。里面还有个版本号,这个对于更新数据库和修改数据库的设计的时候可能需要用到。
SQLiteOpenHelper 实例化实现的代码:

package com.bank;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Environment;
import android.util.Log;

import java.io.File;

/** * Created by zhouchenglin on 2016/3/28. */
public class MySQLiteHelper extends SQLiteOpenHelper {

        //抽象类必须调用父类方法
        public MySQLiteHelper(Context context, String name, CursorFactory factory, int version) {
                //调用父类构造函数
                super(context, getMyDatabaseName(name), factory, version);
        }

        private static String getMyDatabaseName(String name){
                String databasename = name;
                boolean isSdcardEnable = false;
                String state = Environment.getExternalStorageState();
                if(Environment.MEDIA_MOUNTED.equals(state)){//SDCard是否插入
                        isSdcardEnable = true;
                }
                String dbPath = null;
                if(isSdcardEnable){
                        dbPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Finance/database/";
                }else{//未插入SDCard,建在内存中

                }
                File dbp = new File(dbPath);
                if(!dbp.exists()){
                        dbp.mkdirs();
                }
                databasename = dbPath + databasename;
                return databasename;
        }
        /** * 当数据库首次创建时执行该方法,一般将创建表等初始化操作放在该方法中执行. * 重写onCreate方法,调用execSQL方法创建表 */
        @Override
        public void onCreate(SQLiteDatabase db) {
                Log.i("SWORD", "create a Database");
                //创建数据库sql语句
                String sql = "create table finance(ID integer PRIMARY KEY AUTOINCREMENT,Type varchar(10),Time varchar(20),Fee double,Remarks varchar(20),Budget varchar(10))";
                //执行创建数据库操作
                db.execSQL(sql);
        }

        @Override
        //当打开数据库时传入的版本号与当前的版本号不同时会调用该方法
        public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

        }
}

接下来就是数据库具体的操作:

    public void WriteData(ArrayList<String> Data)
    {
            mMysql = new MySQLiteHelper(this, "finance.db", null, 1);
            mDataBase = mMysql.getReadableDatabase();
            ContentValues cv=new ContentValues();
            cv.put("Type",Data.get(0));
            cv.put("Time",Data.get(1));
            cv.put("Fee",Data.get(2));
            cv.put("Remarks",Data.get(3));
            cv.put("Budget",Data.get(4));

            mDataBase.insert("Finance", "Type", cv);
            mDataBase.close();
            mMysql.close();
            //结束当前activity
            this.finish();
    }

这个是自己写的插入到数据库的函数。

这个是从数据库里面读出数据:

        //从数据库获得适配器数据

        public void GetData() {
                  Cursor cursor = mDataBase.rawQuery("select Fee,Budget from finance",null);

                cursor.moveToFirst();

                if (cursor.getCount() > 0) {
                        for (int i = 0; i < cursor.getCount(); i++) {
                                // cursor.move(i);(最好选用MoveToNext,这个函数对于许多数据查询导致失败)
                                //移动到指定记录
                                double Fee = cursor.getDouble(cursor.getColumnIndex("Fee"));
                                String budget = cursor.getString(cursor.getColumnIndex("Budget"));                              
                                if(budget.equals("支出")) {
                                        resultPay += Fee;
                                } else if (budget.equals("收入")){
                                        resultIncome += Fee;
                                }
                                cursor.moveToNext();
                        }
                }


                cursor.close();
                mDataBase.close();
                mMysql.close();
        }

删除数据:
public delete(string id)
{
String[] whereArgs = new String[]{String.valueOf(id)};
//获取当前数据库
mMysql = new MySQLiteHelper(BillsActivity.this, “finance.db”, null, 1);
mDataBase = mMysql.getReadableDatabase();
try {
mDataBase.delete(“Finance”, “ID=?”, whereArgs);
}

}

上面有些是自己开发项目app用到了代码,感觉不是很好,现在我重新整理了下,贴上代码:

package com.fasterry.sqldatabase;

import android.app.Activity;
import android.app.DatePickerDialog;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.widget.TextView;

import java.util.Calendar;

public class MainActivity extends Activity {
        //数据库
        private MySQLiteHelper mMysql;
        private SQLiteDatabase mDataBase;
        private TextView getTime;
        private Calendar calendar;// 用来装日期的
        private DatePickerDialog dialog;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_mian);

                //获取当前数据库
                mMysql = new MySQLiteHelper(this, "finance.db", null, 1);
                mDataBase = mMysql.getReadableDatabase();

                //写入数据库,有两种方法:
                // 第一个种,调用sql
                String sql      ="insert into finance('Type','Time','Fee','Remarks','Budget') values('衣','20160330',37.6,'买衣服','支出')";
                int i =0;
                //写入10条,方便后面查看
                while( i<20)
                {
                        mDataBase.execSQL(sql);
                        i++;
                }
                //执行SQL语句,这个sql语句执行过后,返回值为空,所以一般查询不用这个sql语句
                mDataBase.execSQL(sql);
                //第二种方法,使用insert方法
                //实例化一个ContentValues用来装载待插入的数据
                ContentValues cv = new ContentValues();
                cv.put("Budget","失败");
                cv.put("Type","其他");
                cv.put("Fee",25);
                //Finance为表名,第二个参数表示其中一列的名字,没有就写null表示没有数据就为空,cv表示数据
                mDataBase.insert("Finance",null,cv);

                //数据删除有两种
                String whereClause = "ID=?";//删除的条件
                String[] whereArgs = {"12"};//删除的条件参数
                mDataBase.delete("finance",whereClause,whereArgs);//执行删除
                //sql语句
                sql ="delete from finance where ID=13";
                mDataBase.execSQL(sql);
                //数据修改
                cv = new ContentValues();//实例化ContentValues
                cv.put("Type","bing1");//添加要更改的字段及内容
                 whereClause = "ID=?";//修改条件
                 whereArgs =new String[] {"1"};//修改条件的参数
                mDataBase.update("finance",cv,whereClause,whereArgs);//执行修改

                sql = "update [Finance] set Type = 'bing2' where ID=2";//修改的SQL语句
                mDataBase.execSQL(sql);

                //数据查询

                Cursor c = mDataBase.query("finance",null,null,null,null,null,null);//查询并获得游标
                if(c.moveToFirst()) {//判断游标是否为空
                        for (i = 0; i < c.getCount(); i++) {
                         // c.move(i);//移动到指定记录,数据过多会有问题
                                String username = c.getString(c.getColumnIndex("Type"));
                                String password = c.getString(c.getColumnIndex("Fee"));
                                c.moveToNext();
                                System.out.println(username+password);
                        }
                }

                c = mDataBase.rawQuery("select * from finance where ID=?",new String[]{"13"});
                if(c.moveToFirst()) {
                        String password = c.getString(c.getColumnIndex("Remarks"));
                        System.out.println(password);
                }
                mDataBase.close();
                mMysql.close();

        }

}

这个是具体的操作,但写入到sd卡可能还是有问题,主要是android里面开发有权限问题,需要在AndroidManifest.xml添加读写权限。在application标签上面添加:

``
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

这样就能够在sd里面看到对应的数据库了。

数据库内容:

这篇文章讲解了具体函数调用,点击可以查看

你可能感兴趣的:(数据库,android,sqlite)