GVKun编程网logo

Android Stdio sqlite配置

22

本篇文章给大家谈谈AndroidStdiosqlite配置,同时本文还将给你拓展AndrioidSQLite操作与SQLiteStatement关系、androidEditTextandroid:te

本篇文章给大家谈谈Android Stdio sqlite配置,同时本文还将给你拓展Andrioid SQLite 操作与SQLiteStatement关系、android EditText android:textDirection、Android SQLite数据库:SQLiteDiskIOException:磁盘I / O错误(代码1802)、android stdio 编译项目报Error:Failed to find target with hash string ''android-24等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

Android Stdio sqlite配置

Android Stdio sqlite配置

1.打开Android Studio,找出自己AndroidSDK的安装路径
可以点击File->ProjectStructure快速找到

在这里插入图片描述

2.在SDK目录下点击platform-tools

在这里插入图片描述

3.点进去直接拉到最后面找到sqlite3.exe双击

在这里插入图片描述

在这里插入图片描述

4.将你的platform-tools文件路径添加到环境变量的系统变量的 path里面

选择环境变量

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

5.在命令行查看是否安装成功

在这里插入图片描述


出现上面的图片则配置成功

Andrioid SQLite 操作与SQLiteStatement关系

Andrioid SQLite 操作与SQLiteStatement关系


以插入数据为例,有三种方法:
1)直接拼接sql语句,执行execsql方法;
2)借用ContentValues进行插入;
3)使用compileStatement进行插入;

1)直接拼接sql语句,执行execsql方法

String sql = "create table msgTable(uid INTEGER NOT NULL,msg TEXT NOT NULL)";
db.execsql(sql);

缺点:存在sql注入危险;

源码分析:
execsql 调用关系如下:
public void execsql(String sql) throws sqlException {
   executesql(sql,null);
}

public void execsql(String sql,Object[] bindArgs) throws sqlException {
	if (bindArgs == null) {
		throw new IllegalArgumentException("Empty bindArgs");
	}
	executesql(sql,bindArgs);
}
	
private int executesql(String sql,Object[] bindArgs) throws sqlException {
	if (DatabaseUtils.getsqlStatementType(sql) == DatabaseUtils.STATEMENT_ATTACH) {
		disableWriteAheadLogging();
		mHasAttachedDbs = true;
	}
	
	sqliteStatement statement = new sqliteStatement(this,sql,bindArgs);
	try {
		return statement.executeUpdateDelete();
	} catch (sqliteDatabaseCorruptException e) {
		onCorruption();
		throw e;
	} finally {
		statement.close();
	}
}

从调用关系看:execsql调用的本质就是创建sqliteStatement对象,调用其executeUpdateDelete插入方法,
而executeUpdateDelete() 方法调用native c++方法,具体如下:

public int executeUpdateDelete() {
	try {
		savesqlAsLastsqlStatement();
		acquireAndLock(WRITE);
		int numChanges = 0;
		if ((mStatementType & STATEMENT_DONT_PREPARE) > 0) {
			// since the statement doesn't have to be prepared,// call the following native method which will not prepare
			// the query plan
			native_executesql(msql);
		} else {
			numChanges = native_execute();
		}
		return numChanges;
	} finally {
		releaseAndUnlock();
	}
}

2)借用ContentValues进行插入
ContentValues values = new ContentValues();
values.put("uid",12);
values.put("msg","test");

long newRowId = db.insert("msgTable",null,values);

优点:解决了执行纯sql语句引入的sql注入漏洞。

源码分析:
public long insert(String table,String nullColumnHack,ContentValues values) {
	try {
		return insertWithOnConflict(table,nullColumnHack,values,CONFLICT_NONE);
	} catch (sqlException e) {
		Log.e(TAG,"Error inserting " + values,e);
		return -1;
	}
}


public long insertWithOnConflict(String table,ContentValues initialValues,int conflictAlgorithm) {
	StringBuilder sql = new StringBuilder();
	sql.append("INSERT");
	sql.append(CONFLICT_VALUES[conflictAlgorithm]);
	sql.append(" INTO ");
	sql.append(table);
	sql.append('(');


	Object[] bindArgs = null;
	int size = (initialValues != null && initialValues.size() > 0) ? initialValues.size() : 0;
	if (size > 0) {
		bindArgs = new Object[size];
		int i = 0;
		for (String colName : initialValues.keySet()) {
			sql.append((i > 0) ? "," : "");
			sql.append(colName);
			bindArgs[i++] = initialValues.get(colName);
		}
		sql.append(')');
		sql.append(" VALUES (");
		for (i = 0; i < size; i++) {
			sql.append((i > 0) ? ",?" : "?");
		}
	} else {
		sql.append(nullColumnHack + ") VALUES (NULL");
	}
	sql.append(')');


	sqliteStatement statement = new sqliteStatement(this,sql.toString(),bindArgs);
	try {
		return statement.executeInsert();
	} catch (sqliteDatabaseCorruptException e) {
		onCorruption();
		throw e;
	} finally {
		statement.close();
	}
}

使用ContentValues 最终是创建sqliteStatement对象,并调用executeInsert()方法。

3)使用compileStatement进行插入
sqliteStatement sqliteStatement = db.compileStatement("insert into msgTable(uid,msg) values(?,?)");
sqliteStatement.bindLong(1,12);
sqliteStatement.bindString(3,"text");
long newRowId = sqliteStatement.executeInsert();

源码分析:
public sqliteStatement compileStatement(String sql) throws sqlException {
	verifyDbIsopen();
	return new sqliteStatement(this,null);
}
compileStatement 更加直接,之间是根据传入的参数,创建一个sqliteStatement对象。 小结: 对于执行纯sql,ContentValues和compileStatement最终都是new 一个sqliteStatement对象,并调用sqliteStatement对象的相应方法。

android EditText android:textDirection

android EditText android:textDirection

我想在任何时候都将EditText设置为LTR,我该怎么做?
android:textDirection似乎确实是答案,我不能让该项目使用该指令进行编译

解决方法

使用gravity为editText
android:gravity="right"

Android SQLite数据库:SQLiteDiskIOException:磁盘I / O错误(代码1802)

Android SQLite数据库:SQLiteDiskIOException:磁盘I / O错误(代码1802)

我有一个使用sqlite数据库的应用程序.

我在应用程序启动时创建了数据库,调用了RSSDatabase的构造函数,工作正常.单击一个按钮后,我从RSS提要中获取数据并在AsyncTask中插入数据,但是当我调用db.insert(“posts”,“”,values)时会导致错误,这是logcat的错误消息:

02-04 21:43:22.050  19154-19357/com.example.aolreader E/sqliteLog﹕ (1802) os_unix.c:30026: (2) stat(/data/data/com.example.aolreader/databases/RSS_db) -
02-04 21:43:22.050  19154-19357/com.example.aolreader E/sqliteLog﹕ (1802) statement aborts at 13: [INSERT INTO posts(author,title,date,description,link) VALUES (?,?,?)]
02-04 21:43:22.050  19154-19357/com.example.aolreader E/sqliteDatabase﹕ Error inserting author=AP title=UK admits ‘limited’ role in Operation Blue Star  date=Tue,4 Feb 2014 19:03:27 +0530 description=
    The British government had recently ordered an urgent investigation into possible U.K. involvement in the raid.
    link=http://www.thehindu.com/news/international/world/uk-admits-limited-role-in-operation-blue-star/article5653316.ece
    android.database.sqlite.sqlitediskIOException: disk I/O error (code 1802)
            at android.database.sqlite.sqliteConnection.nativeExecuteForLastInsertedRowId(Native Method)
            at android.database.sqlite.sqliteConnection.executeForLastInsertedRowId(sqliteConnection.java:782)
            at android.database.sqlite.sqliteSession.executeForLastInsertedRowId(sqliteSession.java:788)
            at android.database.sqlite.sqliteStatement.executeInsert(sqliteStatement.java:86)
            at android.database.sqlite.sqliteDatabase.insertWithOnConflict(sqliteDatabase.java:1469)
            at android.database.sqlite.sqliteDatabase.insert(sqliteDatabase.java:1339)
            at com.example.aolreader.RSSDatabase.insertPost(RSSDatabase.java:44)
            at com.example.aolreader.XMLRSSActivity.parseNews(XMLRSSActivity.java:386)
            at com.example.aolreader.XMLRSSActivity.access$000(XMLRSSActivity.java:33)
            at com.example.aolreader.XMLRSSActivity$ParseTask.doInBackground(XMLRSSActivity.java:171)
            at com.example.aolreader.XMLRSSActivity$ParseTask.doInBackground(XMLRSSActivity.java:134)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)

我搜索了这个错误,发现它可能是由同一时间访问数据库的不同线程引起的,但我查看了我的代码,发现没有多线程有竞争条件的情况.

这是我的数据库助手类:

class RSSDatabaseHelper extends sqliteOpenHelper {

    private static final String createPostTablesql = "create table posts (" +
            "_id integer primary key autoincrement," +
            "title varchar," +
            "author varchar," +
            "link varchar," +
            "description varchar," +
            "date varchar)";

    private Context context;

    public RSSDatabaseHelper(Context c,String name,sqliteDatabase.CursorFactory factory,int version) {
        super(c,name,factory,version);
        context = c;
    }

    @Override
    public void onCreate(sqliteDatabase db) {
        db.execsql(createPostTablesql);
    }

    @Override
    public void onUpgrade(sqliteDatabase db,int oldVersion,int newVersion) {
        db.execsql("drop table if exists posts");
        onCreate(db);
    }
}

我的数据库类:

public class RSSDatabase {
    private static RSSDatabase instance;

    private sqliteDatabase db;
    private RSSDatabaseHelper dbHelper;

    private RSSDatabase(Context c) {
        dbHelper = new RSSDatabaseHelper(c,"RSS_db",null,1);
        db = dbHelper.getWritableDatabase();
    }

    public static synchronized RSSDatabase getDatabaseInstance(Context c) {
        if (instance == null) {
            instance = new RSSDatabase(c);
        }
        return instance;
    }

    public void insertPost(Post post) {
        ContentValues values = new ContentValues();
        values.put("title",post.title);
        values.put("author",post.author);
        values.put("link",post.link);
        values.put("description",post.description);
        values.put("date",post.date);
        db.insert("posts","",values);
    }
}

谁能解释一下这个问题呢?

提前致谢!

解决方法

当应用程序启动时,调用RSSDatabase的构造函数,UI Thread会锁定您的数据库
db = dbHelper.getWritableDatabase(); // In the constructor

现在从Async任务(不同的线程),您正在尝试在由UI线程锁定的数据库中插入数据.这将引发异常,因为第一次写入对db有锁定.

android stdio 编译项目报Error:Failed to find target with hash string ''android-24

android stdio 编译项目报Error:Failed to find target with hash string ''android-24

android stdio 编译项目报Error:Failed to find target with hash string ''android-24

 

  • 查看已有的SDK

 

 

 

  • 设置项目的sdk为 25

 

android {

compileSdkVersion 25

buildToolsVersion "25.0.0"

defaultConfig {

applicationId "com.accessibility"

minSdkVersion 14

targetSdkVersion 25

versionCode 1

versionName "1.0"

}

buildTypes {

release {

minifyEnabled false

proguardFiles getDefaultProguardFile(''proguard-android.txt''), ''proguard-rules.pro''

}

}

}

 

编译之后一切OK

 

我们今天的关于Android Stdio sqlite配置的分享就到这里,谢谢您的阅读,如果想了解更多关于Andrioid SQLite 操作与SQLiteStatement关系、android EditText android:textDirection、Android SQLite数据库:SQLiteDiskIOException:磁盘I / O错误(代码1802)、android stdio 编译项目报Error:Failed to find target with hash string ''android-24的相关信息,可以在本站进行搜索。

本文标签: