【发布时间】:2021-03-18 13:02:50
【问题描述】:
我在 Android Studio 中创建了一个扩展 SQLiteOpenHelper 的 DatabaseHelper 类。 getBuildingData 函数不返回任何数据。数据表创建成功,所有数据插入表成功,但getBuildingData函数中的游标没有返回数据。
这是我在课堂上的代码
package com.example.campus_map;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Build;
import androidx.annotation.RequiresApi;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.Base64;
public class DatabaseHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "NDSUMap.db";
public static final String TABLE_NAME = "Building_table";
public static final String Building_col1 = "ID";
public static final String Building_col2 = "Name";
public static final String Building_col3 = "Image";
public static final String Building_col4 = "AltName";
public static final String Building_col5 = "Dept";
public static final String Building_col6 = "Info";
public static Context context;
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, 1);
int imageRes[] = {R.drawable.aghill, R.drawable.library, R.drawable.minard, R.drawable.qbb, R.drawable.union};
this.insertData("A. Glenn Hill Center", convertImg(context, imageRes[0]), "AGHill, STEM Building", "Computer Labs", "The state-funded building houses " +
"classrooms, labs, and study areas, with a focus on science, technology, engineering and mathematics-related courses.");
this.insertData("Library", convertImg(context, imageRes[1]), "", "Center for Writers, Computer Labs, Libraries, Office of the Ombudsperson", "");
this.insertData("Minard Hall", convertImg(context, imageRes[2]), "", "Anthropology, College of Arts, Humanities and Social Sciences, College of Science and Mathematics," +
"Department of Communication, Computer Labs, Emergency Management, English, History, Mathematics, Modern Language, Philogophy, Psychology, Sociology","");
this.insertData("Quentin Burdick Building", convertImg(context, imageRes[3]), "QBB", "Computer Labs, Computer Science, Scomputer Systems Institute, Information Technology Services," +
"ITS Help Desk, Technology Learning and Media Center, Upper Great Plains Transportation Institute", "");
this.insertData("Memorial Union", convertImg(context, imageRes[4]), "", "Bookstore, Card Center, Design&Sign, One Stop, Student Activities Office, " +
"Student Government, Thundar's Game Room, Union Dining Center, US Bank", "");
}
@Override
public void onCreate(SQLiteDatabase db) {
String query = "create table " + TABLE_NAME + "(" + Building_col1 + " INTEGER PRIMARY KEY AUTOINCREMENT, " + Building_col2 + " TEXT, "
+ Building_col3 + " BLOB, " + Building_col4 + " TEXT, " + Building_col5 + " TEXT, " + Building_col6 + " TEXT)";
db.execSQL(query);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
String query = "DROP TABLE IF EXISTS " + TABLE_NAME;
db.execSQL(query);
onCreate(db);
}
public boolean insertData(String name, byte[] img, String altName, String dept, String info){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(Building_col2, name);
contentValues.put(Building_col3, img);
contentValues.put(Building_col4, altName);
contentValues.put(Building_col5, dept);
contentValues.put(Building_col6, info);
long result = db.insert(TABLE_NAME, null, contentValues);
if(result == -1)
return false;
else
return true;
}
@RequiresApi(api = Build.VERSION_CODES.O)
public ArrayList<ArrayList<String>> getBuildingData()
{
SQLiteDatabase db = this.getReadableDatabase();
ArrayList<ArrayList<String>> arrayList = new ArrayList<>();
ArrayList<String> colData = new ArrayList<>();
//create cursor to select all value
Cursor cursor = db.rawQuery("select * from " + TABLE_NAME, null);
//cursor.moveToFirst();
while(cursor.moveToNext())
{
colData.add(String.valueOf(cursor.getInt(cursor.getColumnIndex(Building_col1))));
colData.add(cursor.getString(cursor.getColumnIndex(Building_col2)));
colData.add(Base64.getEncoder().encodeToString(cursor.getBlob(cursor.getColumnIndex(Building_col3))));
colData.add(cursor.getString(cursor.getColumnIndex(Building_col4)));
colData.add(cursor.getString(cursor.getColumnIndex(Building_col5)));
colData.add(cursor.getString(cursor.getColumnIndex(Building_col6)));
arrayList.add(colData);
}
cursor.close();
return arrayList;
}
private byte[] convertImg(Context context, int res)
{
Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), res);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos);
return bos.toByteArray();
}
}
我做了很多谷歌,但我找不到正确的解决方案。
【问题讨论】:
-
为什么不使用 Room 库?处理这些事情要容易得多,而且您可以免费获得 LiveData 和 Observables 的所有刷新逻辑。一开始可能看起来很难,但之后会更容易! developer.android.com/codelabs/android-room-with-a-view-kotlin
标签: android sqlite android-studio android-sqlite sqliteopenhelper