如何自己在Android编写一个Sqlite动态操作软件

浏览前须知:

1.浏览此文章需要一定的Android基础和SQL语言基础
2.如果想要查看我上传的源码,请使用Android Studio。顺便说一句,还在用Eclipse开发Android的童鞋们快用AS吧,模拟器速度快,而且Google快要不更新支持Eclipse的SDK了。
3.这是一个综合性案例,我会找出一些一般老师不会讲到的API出来说一说

基础知识

会Android端Sqlite基础操作的跳过

1.如何打开一个数据库(如果没有被创建则创建)

package com.example.solomon.sqlitemanager.model;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * Created by Solomon on 2015/11/28.
 */
public class MySQLiteOpenHelper extends SQLiteOpenHelper {

    public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}
sqlDb = new MySQLiteOpenHelper(this, (String)list.get(0), null, 1).getReadableDatabase();

数据库的操作可以通过sqlDb这个对象操作

正文

这个应用我采用的是MVC的设计模式,View是Android的界面,我将View得到的Sql语句抛给Controller,由Controller负责调用Model,来进行数据库操作。
流程图

因为SQL语句不同,例如SELECT语句一定有返回值,而INSERT,UPDATE,DELETE 却不需要和SQLITE自带的以.需要开头的语句,所以说需要对于不同的语句进行识别:

if (sql.startsWith(".")){

}else if (buffer.startsWith("SELECT")){

}else{

}

不需要返回的语句其实并没有什么可说的,只要是会一些Android 端SQLite查询的人都知道,但是动态的Sql语句查询是很多老师不会讲的,因为大多数的程序员写的表他们都知道哪个列名对应哪个类型。但是既然是一个Sqlite操作软件,执行Sql语句,我们是不可能去限定用户的输入类型的,因此我们需要自己去判断列的类型。
万幸的是,Android 为我们提供了API,如何判断代码如下:

private static List<List<String>> selelctSQL (SQLiteDatabase sqlDB, String sql){
        Cursor cursor = sqlDB.rawQuery(sql, null);
        List<List<String>> lists = new ArrayList<List<String>>();
        List<String> element;
        element = new ArrayList<String>();
        for (int i = 0; i < cursor.getColumnCount(); i++){
            element.add(cursor.getColumnName(i));
        }
        lists.add(element);
        for (int pos = 0; cursor.moveToNext(); pos++){
            element = new ArrayList<String>();
            for (int i = 0; i < cursor.getColumnCount(); i++) {
                int type = cursor.getType(i);
                switch (type) {
                    case Cursor.FIELD_TYPE_INTEGER:
                        element.add("" + cursor.getInt(i));
                        break;

                    case Cursor.FIELD_TYPE_FLOAT:
                        element.add("" + cursor.getFloat(i));
                        break;

                    case Cursor.FIELD_TYPE_STRING:
                        element.add(cursor.getString(i));
                        break;

                    case Cursor.FIELD_TYPE_BLOB:
                        element.add("暂不支持");
                        break;

                    case Cursor.FIELD_TYPE_NULL:
                        element.add("NULL");
                        break;

                    default:
                        element.add("无法获取");
                        break;
                }
            }
            lists.add(element);
        }

        return lists;
    }

关于如何实现返回值的表格,我使用的是TableLayout加上ScrollView和HorizontalScrollView,使用代码动态添加TableRow。

Layout文件

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <HorizontalScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TableLayout
            android:id="@+id/result"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
        </TableLayout>
    </HorizontalScrollView>
</ScrollView>

动态添加TableRow

package com.example.solomon.sqlitemanager.view;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.GridLayout;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;

import com.example.solomon.sqlitemanager.R;

import java.util.ArrayList;
import java.util.List;
/**
 * Created by Solomon on 2015/12/5.
 */
public class ResultActivity extends Activity{
    final static int [] colors = {0xFFFFFFFF,0xB0E0E6};
    TableLayout result;
    ResultData resultData;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_result);
        result = (TableLayout) findViewById(R.id.result);
        resultData = getIntent().getExtras().getParcelable("resultdata");
        this.initResult(result, resultData.getLists());
    }

    private void initResult (TableLayout tableLayout, List<List<String>> lists){
        TableRow tableRow;
        tableRow = new TableRow(this);

        for (List<String> list : lists){
            tableRow = new TableRow(this);
            this.initResultRow(tableRow, list);
            tableLayout.addView(tableRow, new TableLayout.LayoutParams());
        }
    }

    private void initResultRow (TableRow tableRow, List<String> data){
        TextView tv;
        for (int i = 0; i < data.size(); i++){
            tv = new TextView(this);
            tv.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT, 1));
            tv.setText(data.get(i));
            tv.setBackgroundColor(colors[i % 2]);
            tv.setPadding(3, 0, 3, 3);
            tableRow.addView(tv);
        }
    }
}
package com.example.solomon.sqlitemanager.view;

import android.os.Parcel;
import android.os.Parcelable;

import java.util.List;

/**
 * Created by Solomon on 2015/12/5.
 */
public class ResultData implements Parcelable {
    private List<List<String>> lists;

    public ResultData(List<List<String>> lists) {
        this.lists = lists;
    }

    protected ResultData(Parcel in) {
        //in.readList(lists, ClassLoader.getSystemClassLoader());
        this.lists = in.readArrayList(null);
    }

    public static final Creator<ResultData> CREATOR = new Creator<ResultData>() {
        @Override
        public ResultData createFromParcel(Parcel in) {
            return new ResultData(in);
        }

        @Override
        public ResultData[] newArray(int size) {
            return null;
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeList(lists);
    }

    public List<List<String>> getLists() {
        return lists;
    }

    public void setLists(List<List<String>> lists) {
        this.lists = lists;
    }
}

那么大概如果读者看完了这段文字,就可以自己独立编写出一个自己的Sqlite动态操作软件了。

你也可以下载一下我的项目,自己去看http://download.csdn.net/detail/googol2002/9348041

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值