Android 从sqlite检索记录
对不起,我的英语不好。Android 从sqlite检索记录,android,sqlite,android-sqlite,Android,Sqlite,Android Sqlite,对不起,我的英语不好。 我是Android Studio的新手 我有一个外部数据库。具有列id、text1、text2…text6 不知何故,我在youtube教程之后成功地将该数据库添加到了我的应用程序中。那很好 我将其添加到资产,并在mainActivity中复制到data/data/mypackage/databases。我在emulator文件资源管理器中进行了检查 现在我需要从那个数据库中获取数据,但我不知道该怎么做 id列为自动递增整数。 我的应用程序中有一个数组,其中包含x个在某个
我是Android Studio的新手 我有一个外部数据库。具有列id、text1、text2…text6 不知何故,我在youtube教程之后成功地将该数据库添加到了我的应用程序中。那很好
我将其添加到资产,并在mainActivity中复制到data/data/mypackage/databases。我在emulator文件资源管理器中进行了检查 现在我需要从那个数据库中获取数据,但我不知道该怎么做 id列为自动递增整数。 我的应用程序中有一个数组,其中包含x个在某个范围内随机生成的整数。 现在,我想在数据库中查询数组中的第一个整数,并用结果更新活动中的TextView。在用户点击一个按钮后,我需要从数组中发送下一个整数的另一个查询,以此类推 我不知道热打开数据库,发送查询。。。我尝试了很多教程,在互联网上搜索解决方案,但没有一个奏效。现在我只是糊涂了 我有SQL方面的经验。这不应该是个问题。在PHP和MySql中,只需几行代码即可完成。 谁能帮我解决这个问题 这是我的助手
package com.examle.mydbapp;
import android.annotation.SuppressLint;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.SQLException;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.util.Log;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Locale;
class dbHelper extends SQLiteOpenHelper {
private static final String DATABASE_PATH = "/data/data/com.example.mydbapp/databases/";
private static final String DATABASE_NAME = "quotes.db";
private static final int SCHEMA_VERSION = 1;
public SQLiteDatabase dbSglite;
private final Context myContext;
public dbHelper(Context context) {
super(context, DATABASE_NAME, null, SCHEMA_VERSION);
this.myContext=context;
}
@Override
public void onCreate(SQLiteDatabase db){
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public void createDatabase(){
createDB();
}
private void createDB(){
boolean dbExist = DBExists();
if(!dbExist){
this.getReadableDatabase();
copyDBFromResource();
}
}
private boolean DBExists(){
SQLiteDatabase db = null;
try {
String databasePath = DATABASE_PATH+DATABASE_NAME;
db = SQLiteDatabase.openDatabase(databasePath,null, SQLiteDatabase.OPEN_READWRITE);
db.setLocale(Locale.getDefault());
db.setLockingEnabled(true);
db.setVersion(1);
} catch (SQLiteException e) {
Log.e("SqlHelper", "database not found");
}
if (db != null) {
db.close();
}
return db != null ? true : false;
}
private void copyDBFromResource() {
InputStream inputStream = null;
OutputStream outputStream = null;
String dbFilePath=DATABASE_PATH+DATABASE_NAME;
try {
inputStream = myContext.getAssets().open(DATABASE_NAME);
outputStream = new FileOutputStream(dbFilePath);
byte[] buffer = new byte[1024];
int length;
while ((length=inputStream.read(buffer))>0){
outputStream.write(buffer, 0, length);
}
outputStream.flush();
outputStream.close();
inputStream.close();
} catch (IOException e) {
throw new Error("Problem copying database.");
}
}
public void openDataBase() throws SQLException {
String myPath = DATABASE_PATH + DATABASE_NAME;
dbSglite = SQLiteDatabase.openDatabase(myPath, null,
SQLiteDatabase.OPEN_READWRITE);
}
}
简言之,假设您希望访问活动中的数据,那么 您可以a)创建databasehelper的实例b)调用databasehelper的
createDatabase
方法,然后c)通过调用databasehelper的GetWriteableDatabase
检索SQLiteDatabase实例方法
(您可能已经完成了a和b)
e、 g:-
dbhlpr = new dbHelper(this);
// Create the Database if need be
dbhlpr.createDatabase();
// An example of getting a instance outside of the helper
SQLiteDatabase db = dbhlpr.getWritableDatabase();
您还可以使用SQLiteDatabase db=dbhlpr.dbSglite
而不是SQLiteDatabase db=dbhlpr.getWritableDatabase();
- 其中,在上述
中,是使用dbhlpr
dbHelper dbhlpr定义的类变量代码>
- 空游标是有效游标a;查询不会返回空游标
- 使用列偏移量,例如
可能会有问题,因此替代方法更灵活csr3.getLong(0)
csr3.getLong(csr3.getColumnIndex(“id”)
- 当从
方法返回光标时,它的位置在第一行(-1)之前。要访问数据,必须使用query
方法,例如move???
。csr3.moveToFirst()
方法在移动时返回true,在无法移动时返回false李>移动???
context.getDatabasePath(database_NAME).getParent()获取数据库路径(不带databasename和separatinf/)代码>。为了防止数据库文件夹/目录不存在,更改的帮助程序将使用File databasesdir=new File(myContext.getDatabasePath(DATABASE_NAME.getParent())创建目录;
databasesdir.mkdirs()代码>
完整助手是:-
class dbHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "quotes.db";
private static final int SCHEMA_VERSION = 1;
public SQLiteDatabase dbSglite;
private String mDBPAth;
private final Context myContext;
public dbHelper(Context context) {
super(context, DATABASE_NAME, null, SCHEMA_VERSION);
this.myContext=context;
this.mDBPAth = context.getDatabasePath(DATABASE_NAME).getParent();
}
@Override
public void onCreate(SQLiteDatabase db){
Log.d("ONCREATE","OnCreate Method Called.");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public void createDatabase(){
createDB();
}
private void createDB(){
boolean dbExist = DBExists();
if(!dbExist){
copyDBFromResource();
}
dbSglite = getWritableDatabase();
}
private boolean DBExists(){
SQLiteDatabase db = null;
try {
String databasePath = myContext.getDatabasePath(DATABASE_NAME).getPath();
db = SQLiteDatabase.openDatabase(databasePath,null, SQLiteDatabase.OPEN_READWRITE);
db.setLocale(Locale.getDefault());
db.setLockingEnabled(true);
db.setVersion(1);
} catch (SQLiteException e) {
Log.e("SqlHelper", "database not found");
}
if (db != null) {
db.close();
}
return db != null;
}
private void copyDBFromResource() {
InputStream inputStream = null;
OutputStream outputStream = null;
try {
inputStream = myContext.getAssets().open(DATABASE_NAME);
File databasesdir = new File(myContext.getDatabasePath(DATABASE_NAME).getParent());
databasesdir.mkdirs();
outputStream = new FileOutputStream(mDBPAth+"/"+DATABASE_NAME);
byte[] buffer = new byte[1024];
int length;
while ((length=inputStream.read(buffer))>0){
outputStream.write(buffer, 0, length);
}
outputStream.flush();
outputStream.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
throw new Error("Problem copying database.");
}
}
public void openDataBase() throws SQLException {
String myPath = myContext.getDatabasePath(DATABASE_NAME).getPath();
dbSglite = SQLiteDatabase.openDatabase(myPath, null,
SQLiteDatabase.OPEN_READWRITE);
}
}
数据库在哪里?您是否刚刚将其添加为资产,或者它是以某种方式存在于data/data/your_package/databases中,还是存在于其他地方。我将其添加到资产,并在mainActivity中复制到data/data/mypackage/databases中。我在emulator文件资源管理器中检查了它。的副本。询问前请仔细搜索。
// Get and process data from the quotes table
Cursor csr2 = db.query("quotes",null,null,null,null,null,null);
while (csr2.moveToNext()) {
String tblinfo = "Row " + csr2.getPosition();
for (int i=0; i < csr2.getColumnCount(); i++) {
tblinfo = tblinfo + " Column = " + csr2.getColumnName(i) + " Value = " + csr2.getString(i);
}
Log.d("CURSOR 2 INFO",tblinfo);
}
csr2.close();
// Get and processs data for a specific row according to id
Cursor csr3 = db.query("quotes",null,"id=?",new String[]{"1"},null,null,null);
if (csr3.moveToFirst()) {
Log.d("CURSOR 3 INFO",
" ID is" + csr3.getLong(0) +
" ID is " + csr3.getLong(csr3.getColumnIndex("id")) +
" TEXT1 is " + csr3.getString(csr3.getColumnIndex("text1"))
// ..... etc
);
}
csr3.close();
-15 11:30:20.066 8446-8446/? E/SQLiteLog: (14) cannot open file at line 30046 of [9491ba7d73]
11-15 11:30:20.066 8446-8446/? E/SQLiteLog: (14) os_unix.c:30046: (2) open(/data/data/mjt.usingrecyclerviews/databases/quotes.db) -
11-15 11:30:20.066 8446-8446/? E/SQLiteDatabase: Failed to open database '/data/data/mjt.usingrecyclerviews/databases/quotes.db'.
android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:209)
at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193)
at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)
at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)
at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)
at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:806)
at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:791)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:669)
at mjt.usingrecyclerviews.dbHelper.DBExists(dbHelper.java:68)
at mjt.usingrecyclerviews.dbHelper.createDB(dbHelper.java:54)
at mjt.usingrecyclerviews.dbHelper.createDatabase(dbHelper.java:49)
at mjt.usingrecyclerviews.MainActivity.onCreate(MainActivity.java:27)
at android.app.Activity.performCreate(Activity.java:5990)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
11-15 11:30:20.066 8446-8446/? E/SqlHelper: database not found
11-15 11:30:20.093 8446-8446/? D/ONCREATE: OnCreate Method Called.
11-15 11:30:20.096 8446-8446/? D/SQLITEINFO: Row 0 Column = type Value = table Column = name Value = quotes Column = tbl_name Value = quotes Column = rootpage Value = 2 Column = sql Value = CREATE TABLE quotes (id INTEGER PRIMARY KEY, text1 TEXT, text2 TEXT, text3 TEXT, text4 TEXT, text5 TEXT)
11-15 11:30:20.096 8446-8446/? D/SQLITEINFO: Row 1 Column = type Value = table Column = name Value = android_metadata Column = tbl_name Value = android_metadata Column = rootpage Value = 3 Column = sql Value = CREATE TABLE android_metadata (locale TEXT)
11-15 11:30:20.096 8446-8446/? D/CURSOR 2 INFO: Row 0 Column = id Value = 1 Column = text1 Value = Some quote Column = text2 Value = Another quote Column = text3 Value = Yet another quote Column = text4 Value = This is a quote Column = text5 Value = Too many quotes
11-15 11:30:20.096 8446-8446/? D/CURSOR 2 INFO: Row 1 Column = id Value = 2 Column = text1 Value = Seccond quote Column = text2 Value = Third Quote Column = text3 Value = Fourth Quote Column = text4 Value = Fifth Quote Column = text5 Value = Sixth Quote
11-15 11:30:20.096 8446-8446/? D/CURSOR 3 INFO: ID is1 ID is 1 TEXT1 is Some quote
11-15 11:33:17.111 8511-8511/mjt.usingrecyclerviews D/SQLITEINFO: Row 0 Column = type Value = table Column = name Value = quotes Column = tbl_name Value = quotes Column = rootpage Value = 2 Column = sql Value = CREATE TABLE quotes (id INTEGER PRIMARY KEY, text1 TEXT, text2 TEXT, text3 TEXT, text4 TEXT, text5 TEXT)
11-15 11:33:17.111 8511-8511/mjt.usingrecyclerviews D/SQLITEINFO: Row 1 Column = type Value = table Column = name Value = android_metadata Column = tbl_name Value = android_metadata Column = rootpage Value = 3 Column = sql Value = CREATE TABLE android_metadata (locale TEXT)
11-15 11:33:17.111 8511-8511/mjt.usingrecyclerviews D/CURSOR 2 INFO: Row 0 Column = id Value = 1 Column = text1 Value = Some quote Column = text2 Value = Another quote Column = text3 Value = Yet another quote Column = text4 Value = This is a quote Column = text5 Value = Too many quotes
11-15 11:33:17.112 8511-8511/mjt.usingrecyclerviews D/CURSOR 2 INFO: Row 1 Column = id Value = 2 Column = text1 Value = Seccond quote Column = text2 Value = Third Quote Column = text3 Value = Fourth Quote Column = text4 Value = Fifth Quote Column = text5 Value = Sixth Quote
11-15 11:33:17.113 8511-8511/mjt.usingrecyclerviews D/CURSOR 3 INFO: ID is1 ID is 1 TEXT1 is Some quote
class dbHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "quotes.db";
private static final int SCHEMA_VERSION = 1;
public SQLiteDatabase dbSglite;
private String mDBPAth;
private final Context myContext;
public dbHelper(Context context) {
super(context, DATABASE_NAME, null, SCHEMA_VERSION);
this.myContext=context;
this.mDBPAth = context.getDatabasePath(DATABASE_NAME).getParent();
}
@Override
public void onCreate(SQLiteDatabase db){
Log.d("ONCREATE","OnCreate Method Called.");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public void createDatabase(){
createDB();
}
private void createDB(){
boolean dbExist = DBExists();
if(!dbExist){
copyDBFromResource();
}
dbSglite = getWritableDatabase();
}
private boolean DBExists(){
SQLiteDatabase db = null;
try {
String databasePath = myContext.getDatabasePath(DATABASE_NAME).getPath();
db = SQLiteDatabase.openDatabase(databasePath,null, SQLiteDatabase.OPEN_READWRITE);
db.setLocale(Locale.getDefault());
db.setLockingEnabled(true);
db.setVersion(1);
} catch (SQLiteException e) {
Log.e("SqlHelper", "database not found");
}
if (db != null) {
db.close();
}
return db != null;
}
private void copyDBFromResource() {
InputStream inputStream = null;
OutputStream outputStream = null;
try {
inputStream = myContext.getAssets().open(DATABASE_NAME);
File databasesdir = new File(myContext.getDatabasePath(DATABASE_NAME).getParent());
databasesdir.mkdirs();
outputStream = new FileOutputStream(mDBPAth+"/"+DATABASE_NAME);
byte[] buffer = new byte[1024];
int length;
while ((length=inputStream.read(buffer))>0){
outputStream.write(buffer, 0, length);
}
outputStream.flush();
outputStream.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
throw new Error("Problem copying database.");
}
}
public void openDataBase() throws SQLException {
String myPath = myContext.getDatabasePath(DATABASE_NAME).getPath();
dbSglite = SQLiteDatabase.openDatabase(myPath, null,
SQLiteDatabase.OPEN_READWRITE);
}
}