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里面看到对应的数据库了。

数据库内容:

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

更多相关文章

  1. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
  2. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  3. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  4. Android有效获取状态栏(StatusBar)高度的方法
  5. [置顶] Android(安卓)轻松实现仿QQ消息下拉刷新
  6. Android(安卓)解决崩溃后重启的问题
  7. Android(安卓)使用sharedpreferences、ACache缓存用户名和密码
  8. Android应用在不同版本间兼容性处理
  9. Android(安卓)Socket 通信实例...【Pnoker】

随机推荐

  1. android 比较全的android 源码合集 + 企
  2. Android系统进程Zygote启动过程的源代码
  3. Android(安卓)视图动画(View Animation)
  4. android 比较全的android 源码合集 + 企
  5. Android(安卓)不能使用内部资源
  6. Android(安卓)使用WindowManager打造通用
  7. IntentService简介
  8. Android(安卓)[Camera 源码] 相机 HAL3(C
  9. Android(安卓)canvas PaintFlagsDrawFilt
  10. Android利用WebService查询手机号码归属