#java #android #sqlite #mvvm #android-mvvm
Вопрос:
Я искал везде, но не нашел никакой информации, учебника или блогов, касающихся sqlite с MVVM. как мне создать viewmodel для моих методов sqlite? я пробовал различные способы доступа к нему, но выдает ошибку
ниже приведен мой код для вспомогательного класса sqlite
public class DbHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 2;
static final String DATABASE_NAME = "kuncorosqlite.db";
public static final String TABLE_SQLite = "sqlite";
public static final String COLUMN_ID = "id";
public static final String COLUMN_NAME = "name";
public static final String COLUMN_ADDRESS = "address";
public DbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
final String SQL_CREATE_MOVIE_TABLE = "CREATE TABLE " TABLE_SQLite " ("
COLUMN_ID " INTEGER PRIMARY KEY autoincrement, "
COLUMN_NAME " TEXT NOT NULL, "
COLUMN_ADDRESS " TEXT NOT NULL"
" )";
db.execSQL(SQL_CREATE_MOVIE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " TABLE_SQLite);
onCreate(db);
}
public ArrayList<HashMap<String, String>> getAllData() {
ArrayList<HashMap<String, String>> wordList;
wordList = new ArrayList<HashMap<String, String>>();
String selectQuery = "SELECT * FROM " TABLE_SQLite;
SQLiteDatabase database = this.getWritableDatabase();
Cursor cursor = database.rawQuery(selectQuery, null);
if (cursor.moveToFirst()) {
do {
HashMap<String, String> map = new HashMap<String, String>();
map.put(COLUMN_ID, cursor.getString(0));
map.put(COLUMN_NAME, cursor.getString(1));
map.put(COLUMN_ADDRESS, cursor.getString(2));
wordList.add(map);
} while (cursor.moveToNext());
}
Log.e("select sqlite ", "" wordList);
database.close();
return wordList;
}
public void insert(String name, String address) {
SQLiteDatabase database = this.getWritableDatabase();
String queryValues = "INSERT INTO " TABLE_SQLite " (name, address) "
"VALUES ('" name "', '" address "')";
Log.e("insert sqlite ", "" queryValues);
database.execSQL(queryValues);
database.close();
}
public void update(int id, String name, String address) {
SQLiteDatabase database = this.getWritableDatabase();
String updateQuery = "UPDATE " TABLE_SQLite " SET "
COLUMN_NAME "='" name "', "
COLUMN_ADDRESS "='" address "'"
" WHERE " COLUMN_ID "=" "'" id "'";
Log.e("update sqlite ", updateQuery);
database.execSQL(updateQuery);
database.close();
}
public void delete(int id) {
SQLiteDatabase database = this.getWritableDatabase();
String updateQuery = "DELETE FROM " TABLE_SQLite " WHERE " COLUMN_ID "=" "'" id "'";
Log.e("update sqlite ", updateQuery);
database.execSQL(updateQuery);
database.close();
}
}
модель просмотра до сих пор, до сих пор, что я пробовал :-
public class Viewmodell extends AndroidViewModel {
private DbHelper repository ;
MutableLiveData<ArrayList<HashMap<String, String>>> allNotesLivedata;
public Viewmodell(@NonNull Application application) {
super(application);
repository = new DbHelper(application);
allNotesLivedata = repository.getAllData();
}
void insert(String name,String Address) {
repository.insert(name,Address);
}
void update(int id, String name, String address) {
repository.update(id,name,address);
}
void delete(int id) {
repository.delete(id);
}
public LiveData<ArrayList<HashMap<String, String>>> getAllNotes() {
return allNotesLivedata;
}
}
пожалуйста, не предлагайте мне использовать room
, потому что это не мое требование
Комментарии:
1. Вы можете создать новый объект
DbHelper
класса в своей модели представления и получить доступ к этим методам. Ты пробовал так поступить?2. Вы также можете вставить свой
ViewModel
код?3. я добавил @Jacek amp; jeel
4. @JeelVankhede я застрял в том, как мне получить к нему доступ …в соответствии с моим классом sqlite
5. получение ошибки при
allNotes = repository.getAllData();
Ответ №1:
Ошибка просто означает, что вы не отправляете совместимые значения :
В вашем коде при создании MutableLiveData вы назначили его
ArrayList<HashMap<String,String>>
но при установке значения в MutableLiveData вы просто передаете хэш-карту . Итак ,что вам нужно сделать, вместо того, чтобы передавать HashMap напрямую, вам нужно создать список массивов, а затем в этот список массивов вам нужно передать свою хэш-карту, а затем установить для списка массивов значение MutableLiveData .
Вы можете сделать это примерно так .Приведенный ниже код предназначен для иллюстрации
//Create an arrayList
ArrayList<HashMap> listofMaps = new ArrayList();
//then add all your hashmaps to your list
listofMaps.add(map);
//and then set it to the MutableLiveData
wordList.postValue(listOfMaps);
Или вместо описанного выше процесса второй способ решения этой проблемы заключается в том , что вам просто нужно создать изменяемые данные типа : HashMap<Строка , Строка>
wordList = new MutableLiveData<HashMap<String,String>>();
Комментарии:
1. карунеш я добавил последнюю версию ss пожалуйста, взгляните
2. но у меня есть одна проблема во время получения списка, можете ли вы помочь? могу ли я обновить код?
3. Вам нужно создать еще один вопрос для того же самого . Обновление кода и перенос его в другой контекст просто повредит цели того, о чем вы просили, и никто другой не сможет извлечь из этого выгоду . Помните, что мы все здесь также для того, чтобы помогать друг другу
4. Просто пропингуйте ссылку на следующий вопрос в разделе комментариев, чтобы я знал, и просто восстановите этот пост с теми ss, которые вы опубликовали ранее