Как отобразить данные?
Вам необходимо решить, как / где вы хотите, чтобы данные отображались.Если предположить в Activity и через ListView, то: -
Затем вы извлечете данные с помощью запроса, возможно, используя SQLiteDatabase query метод для извлечения Cursor.
Затем вы можете через адаптер курсора, например, SimpleCursorAdapter
- Обратите внимание, что для CursorAdapters требуется столбец с именем _id , идолжен быть псевдонимом столбца rowid .
отображать строки в ListView .
Puttingэто вместе
Следующий код (примечание показывает только имя и школу в списке, вы можете создать подходящий макет) - это рабочий пример, основанный на базе данных ( test.db ), содержащейтаблица с именем пользователь , в которой есть столбцы числа , имя и школа
- Примечание Справка базы данных была изменена для работы с Android 9 +
DatabaseHelper.java
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "test.db";
private static final int DATABASE_VERSION = 1;
private static String DATABASE_PATH;
private final Context context;
SQLiteDatabase db;
//private static final String DATABASE_PATH = "/data/data/" + context.getPackageName() + "/databases/"; //<<<<<<<<<< no need to hard code anything see below
public final static String USER_TABLE = "user";
public final static String USER_NUMBERS_COLUMN = "numbers";
public final static String USER_NAME_COLUMN = "name";
public final static String USER_SCHOOL_COLUMN = "school";
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.context = context;
DATABASE_PATH = context.getDatabasePath(DATABASE_NAME).getPath(); //<<<<<<<<<< Recommended way
createDb();
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public void createDb() {
boolean dbExist = checkDbExist();
if (!dbExist) {
//this.getReadableDatabase(); //<<<<<<<< will mess up Android 9 as it creates -wal and -shm files
copyDatabase();
}
}
private boolean checkDbExist() {
/**
* Checks the file instead of trying to open the database,
* makes directories if needed (the get around to this was opening the database to create them)
*/
File db = new File(DATABASE_PATH);
if (!db.exists()) {
if(!new File(db.getParent()).exists()) {
new File(db.getParent()).mkdirs();
}
return false;
} else {
return true;
}
/* Done away with unreliable method
SQLiteDatabase sqLiteDatabase = null;
try {
String path = DATABASE_PATH;
sqLiteDatabase = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);
} catch (Exception ex) {
}
if (sqLiteDatabase != null) {
sqLiteDatabase.close();
return true;
}
return false;
*/
}
private void copyDatabase() {
try {
InputStream inputStream = context.getAssets().open(DATABASE_NAME);
String outFileName = DATABASE_PATH;
OutputStream outputStream = new FileOutputStream(outFileName);
byte[] b = new byte[1024];
int length;
while ((length = inputStream.read(b)) > 0) {
outputStream.write(b, 0, length);
}
outputStream.flush();
outputStream.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private SQLiteDatabase openDatabase() {
String path = DATABASE_PATH;
db = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READWRITE);
return db;
}
public void close() {
if (db != null) {
db.close();
}
}
/**
* Extract all columns for all rows adding column _id for CursorAdapter
*/
public Cursor getAllMyData() {
SQLiteDatabase db = this.getWritableDatabase();
String[] columns = new String[]{"*,rowid AS " + BaseColumns._ID};
return db.query(
USER_TABLE,columns,
null,null,null,null,null);
}
}
- Примечания
- см. Комментарии для некоторых объяснений
- некоторый старый код был оставлен, но закомментирован
MainActivity.java
Это действие, которое использовалось и включает ListView
public class MainActivity extends AppCompatActivity {
DatabaseHelper mDBHlpr;
Cursor mCsr;
ListView mUserList;
SimpleCursorAdapter mSCA;
Context mContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = this;
mUserList = this.findViewById(R.id.userlist); //<<<<<<<<<< id of the ListView
mDBHlpr = new DatabaseHelper(this); //Instantiate the database helper
setupOrRefreshTheListView();
}
private void setupOrRefreshTheListView() {
mCsr = mDBHlpr.getAllMyData();
if (mSCA == null) {
mSCA = new SimpleCursorAdapter(
this,
android.R.layout.simple_list_item_2,
mCsr,
// Columns from the Cursor to include in the ListView (must have a corresponding view in the layout)
new String[]{
DatabaseHelper.USER_NAME_COLUMN,
DatabaseHelper.USER_SCHOOL_COLUMN
},
// Views in the ListView into which the Data is placed (must correspond with Column in the Cursor)
new int[]{
android.R.id.text1,
android.R.id.text2},
0
);
mUserList.setAdapter(mSCA);
// Add an on item click listener in this case Toasts data
mUserList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(
mContext,
"You clicked the row with an ID of " + String.valueOf(id) +
" Name is " + mCsr.getString(mCsr.getColumnIndex(DatabaseHelper.USER_NAME_COLUMN)) +
" School is " + mCsr.getString(mCsr.getColumnIndex(DatabaseHelper.USER_SCHOOL_COLUMN)) +
" Numbers is " + String.valueOf(mCsr.getInt(mCsr.getColumnIndex(DatabaseHelper.USER_NUMBERS_COLUMN))),
Toast.LENGTH_SHORT).show();
}
});
} else {
mSCA.swapCursor(mCsr); // This reapplies the Cursor to reflect any changes
}
}
}
Выше было выполнено для API 21 (Lollipop), а также 28 (Pie).Ниже приведен пример снимка экрана: -
![enter image description here](https://i.stack.imgur.com/t8Gim.png)