Spatialite for android 数据库操作
·
简介
spatialite本身基于SQLite 3、PROJ.4、GEOS、FreeXL等开源项目,支持对空间数据的处理,可以做数据的投影转换等,功能强大。
官网地址:http://www.gaia-gis.it/gaia-sins/
下载sptialite for android: https://www.gaia-gis.it/fossil/libspatialite/wiki?name=splite-android
同时官网上可以下载数据库链接工具:sptialite_gui 官网下载
实例
下面新建一个对Spatialite for android 的实例,实现新建或创建一个数据库,创建表,增加空间字段Geometry,插入空间数据等。
1 导入库,包括libs:the native spatialite libraries
libspatialite.so: for different platforms that hold the main library
jsqlite:the basic API classes
下载地址:http://www.gaia-gis.it/gaia-sins/spatialite-android/spatialite-for-android-3.0.1.zip
jts包: compile ‘com.vividsolutions:jts-core:1.14.0’
2 创建一个专门处理数据库的类
package com.yulintu.spatialiteforandroid;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.Point;
import com.vividsolutions.jts.geom.PrecisionModel;
import com.vividsolutions.jts.geom.impl.CoordinateArraySequenceFactory;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import jsqlite.Database;
import jsqlite.Exception;
import jsqlite.Stmt;
public class SpatialiteHelper {
Database db;
StringBuffer sb = new StringBuffer();
private int Id = 0;
int srid = 4326;
//打开或创建数据库
public Database openOrCreateDatabase(String dbPath) {
if (StringUtils.isBlank(dbPath)) {
return null;
}
try {
db = new jsqlite.Database();
db.open(dbPath, jsqlite.Constants.SQLITE_OPEN_READWRITE
| jsqlite.Constants.SQLITE_OPEN_CREATE);
} catch (Exception e) {
e.printStackTrace();
}
return db;
}
//查询数据库版本
public String queryVerson() throws Exception {
if (db == null || sb == null)
return null;
Stmt stmt = db.prepare("SELECT spatialite_version();");
if (stmt.step()) {
sb.append("spatialite_version:" + stmt.column_string(0));
sb.append("\n");
}
stmt = db.prepare("SELECT proj4_version();");
if (stmt.step()) {
sb.append("proj4_version:" + stmt.column_string(0));
sb.append("\n");
}
stmt = db.prepare("SELECT geos_version();");
if (stmt.step()) {
sb.append("geos_version:" + stmt.column_string(0));
sb.append("\n");
}
stmt.close();
return sb.toString();
}
//初始化空间元数据
public String initSpatialMetaData() throws Exception {
if (db == null)
return sb.toString();
Stmt stmt = db.prepare("select InitSpatialMetaData(1)");
while (stmt.step()) {
String nomeStr = "InitSpatialMetaData():" + stmt.column_string(0);
sb.append("\n").append(nomeStr).append("\n");
}
stmt.close();
return sb.toString();
}
//检查是空间元数据是否创建成功
public boolean checkSpatialMetaData() throws Exception {
if (db == null)
return false;
Stmt stmt = db.prepare("select checkSpatialMetaData()");
int flag = 0;
if (stmt.step()) {
flag = stmt.column_int(0);
}
stmt.close();
return flag == 1;
}
//创建表
public String createTable(final String tableName, Map<String, String> fields) throws Exception {
if (db == null)
return sb.toString();
StringBuilder sql = new StringBuilder("CREATE TABLE " + tableName);
sql.append("(");
int i = 0;
for (Map.Entry<? extends Object, String> entry : fields.entrySet()) {
sql.append(entry.getKey());
sql.append(" ");
sql.append(entry.getValue());
if (i == fields.size() - 1)
break;
sql.append(",");
i++;
}
sql.append(");");
db.spatialite_create();
db.exec(sql.toString(), null);
return sb.toString();
}
//列出所有表
public String listTable() throws Exception {
if (db == null || sb == null)
return null;
Stmt stmt = db.prepare("SELECT name,rootpage,sql FROM sqlite_master WHERE type='table' order by name");
while (stmt.step()) {
String nomeStr = stmt.column_string(0);
sb.append("\t").append(nomeStr).append("\n");
String rootpage = stmt.column_string(1);
sb.append("\t").append(rootpage).append("\n");
String sql = stmt.column_string(2);
sb.append("\t").append(sql).append("\n");
}
stmt.close();
getFields("person");
return sb.toString();
}
//查询表的记录
public String query(String tableName) throws Exception {
if (db == null || sb == null)
return null;
Stmt stmt = db.prepare("SELECT Id,username,AsText(shape) FROM " + tableName);
while (stmt.step()) {
String Id = stmt.column_string(0);
sb.append("\t").append(Id).append("\n");
String name = stmt.column_string(1);
sb.append("\t").append(name).append("\n");
String shape = stmt.column_string(2);
sb.append("\t").append(shape).append("\n");
}
stmt.close();
return sb.toString();
}
//为表添加一个空间字段
public String AddGeometryColumn(String tableName, String column) throws Exception {
if (db == null || sb == null)
return sb.toString();
String sql = "select AddGeometryColumn('" + tableName + "','" + column + "',4326,'GEOMETRY')";
Stmt stmt = db.prepare(sql);
int flag = 0;
if (stmt.step()) {
flag = stmt.column_int(0);
if (flag == 1) {
createSpatialIndex(tableName, column);
}
}
stmt.close();
sb.append("AddGeometryColumn " + column + ":" + flag);
return sb.toString();
}
//创建索引
public String createSpatialIndex(final String tableName, String column) throws Exception {
if (db == null || sb == null)
return sb.toString();
String sql = "SELECT CreateSpatialIndex('" + tableName + "', '" + column + "');";
Stmt stmt=db.prepare(sql);
int flag=0;
if(stmt.step()){
flag=stmt.column_int(0);
}
sb.append("\nCreateSpatialIndex+"+flag);
return sb.toString();
}
//插入一条数据
public String insertData(String tableName) throws Exception {
if (db == null)
return sb.toString();
GeometryFactory geometryFactory = new GeometryFactory(new PrecisionModel(), srid,
CoordinateArraySequenceFactory.instance());
Coordinate coord = new Coordinate(109.013388, 32.715519);
Point p = geometryFactory.createPoint(coord);
String sql = "INSERT INTO " + tableName + " (Id,username,password,shape) values ("+Id+",'chen','123456',GeomFromText('"+p+"',4326))";
db.exec(sql,null);
long l=db.changes();
sb.append("\nINSERT :" + l);
return sb.toString();
}
//删除表
public String dropTable(String tableName) throws Exception {
if (db == null)
return sb.toString();
String sql = " DROP TABLE " + tableName;
db.exec(sql,null);
sb.append("\nDROP TABLE " );
return sb.toString();
}
public List<SQLiteFieldInfo> getFields(String tableName) throws Exception {
if (db == null)
return null;
String sql = "PRAGMA table_info(" + tableName + ")";
Stmt stmt = db.prepare(sql);
List<SQLiteFieldInfo> list = new ArrayList<>();
while (stmt.step()) {
int index = stmt.column_int(0);
String name = stmt.column_string(1);
String type = stmt.column_string(2);
int notnull = stmt.column_int(3);
Object column = stmt.column(4);
int key = stmt.column_int(5);
SQLiteFieldInfo sqLiteFieldInfo = new SQLiteFieldInfo(index, name, type, notnull, column, key);
list.add(sqLiteFieldInfo);
}
return list;
}
//关闭库
public void close() {
if (db != null) {
try {
db.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
3 调用该类方法实现空间数据库的创建初始化等。
package com.yulintu.spatialiteforandroid;
import android.databinding.DataBindingUtil;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import com.yulintu.spatialiteforandroid.databinding.ActivityMainBinding;
import java.util.HashMap;
import java.util.Map;
import jsqlite.Database;
import jsqlite.Exception;
public class MainActivity extends AppCompatActivity {
ActivityMainBinding bind;
MainViewModel mainViewModel;
final SpatialiteHelper helper = new SpatialiteHelper();
String tableName = "person";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
bind = DataBindingUtil.setContentView(this, R.layout.activity_main);
mainViewModel = new MainViewModel();
bind.setModel(mainViewModel);
String dataBasePath = FileUtil.getDataBasePath("123.sqlite");
Database db = helper.openOrCreateDatabase(dataBasePath);
String s = null;
try {
s = helper.queryVerson();
mainViewModel.setResult(s);
} catch (Exception e) {
e.printStackTrace();
}
bind.initMetaData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
mainViewModel.setResult(helper.initSpatialMetaData());
} catch (Exception e) {
e.printStackTrace();
}
}
});
bind.createTable.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Map<String, String> feilds = new HashMap<String, String>();
feilds.put("tableName",tableName);
feilds.put("Id", "INT PRIMARY KEY NOT NULL");
feilds.put("username", "CHAR(50)");
feilds.put("password", "CHAR(50)");
try {
mainViewModel.setResult(helper.createTable(feilds));
} catch (Exception e) {
e.printStackTrace();
}
}
});
bind.listTable.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
mainViewModel.setResult(helper.listTable());
} catch (Exception e) {
e.printStackTrace();
}
}
});
bind.query.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
mainViewModel.setResult(helper.query(tableName));
} catch (Exception e) {
e.printStackTrace();
}
}
});
bind.addShape.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
mainViewModel.setResult(helper.AddGeometryColumn(tableName, "shape"));
} catch (Exception e) {
e.printStackTrace();
}
}
});
bind.insertData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
mainViewModel.setResult(helper.insertData(tableName));
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
helper.close();
}
}
更多推荐


所有评论(0)