【问题标题】:SQLite "select * from table" doesnt work in android studioSQLite“从表中选择*”在android studio中不起作用
【发布时间】: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();
}
}

我做了很多谷歌,但我找不到正确的解决方案。

【问题讨论】:

标签: android sqlite android-studio android-sqlite sqliteopenhelper


【解决方案1】:

moveToFirst() - 如果光标为空,此方法将返回 false。

moveToNext() - 如果光标已经超过结果集中的最后一个条目,此方法将返回 false。

试试

if (cursor.moveToFirst()) {
            
            do 
            {
            
                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);
            } 
            
            while (cursor.moveToNext());
 }

【讨论】:

  • 在 rawQuer() 执行之后,使用 while(cursor.moveToNext()) {...}if (cursor.moveToFirst()) { do {...} while (cursor.moveToNext());} 没有区别。所以你的代码相当于OP的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 2016-02-03
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
  • 2023-04-04
  • 1970-01-01
相关资源
最近更新 更多