Невозможно получить доступ к данным из ViewModel, которая изначально получает данные из предварительной комнатной базы дAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Невозможно получить доступ к данным из ViewModel, которая изначально получает данные из предварительной комнатной базы д

Сообщение Anonymous »

Доброе утро,
Я опытный программист, но новичок в разработке Android. Это то, что я в конце концов хочу работать. Я делаю систему продажи для пекарни. У меня есть предварительная база данных с одной таблицей, где каждая строка содержит имя, цену, а также другие предметы каждого продукта. Основная активность состоит из нескольких фрагментов. Почти во всех фрагментах есть переработка для хранения информации о продукте. Есть мексиканское тесто под названием Conchas. Я нахожусь в точке, когда я могу показать все различные типы конч в переработке, где пользователь приложения Android Point of Sale может выбрать, какой тип кончики они хотят вместе с количеством кончений. После нажатия кнопки выбранные продукты попадают в переработку, который существует в другом фрагменте. В фрагменте, где перечислены кончики, я могу получить данные, которые существуют в базе данных комнаты, и использовать информацию в моем приложении в качестве Livedata. Вот фрагменты кода, чтобы лучше объяснить мою ситуацию: < /p>
Объект базы данных, созданный как Singleton: < /p>
`@database (entities = {product.class}, версия = 1)
public Abstract Class Posdatabase extends poomdatabase {< /p>
public abstract ProductDAO getProductDAO();

private static POSDatabase dbInstance;

public static synchronized POSDatabase getInstance(Context context) {

if(dbInstance == null){
dbInstance = Room.databaseBuilder(
context.getApplicationContext(),
POSDatabase.class,
"pos.db").
createFromAsset("database/initial_pos.db").
fallbackToDestructiveMigration().build();
}
return dbInstance;
}
< /code>
} `< /p>
DAO Методы, которые я использую из интерфейса DAO: < /p>
` @dao
product productdao {< /p>
@Insert
void insert(Product product);

@Delete
void delete(Product product);

@Update
void updateProducts(List products);

@Query("SELECT * FROM products_table WHERE outer_product_name = :outerProduct")
LiveData getCorrespondingInnerProducts(String outerProduct);

@Query("SELECT * FROM products_table")
LiveData getAll();
< /code>
} `< /p>
Соответствующий репозиторий: < /p>
` public class Repository {< /p>
private final ProductDAO productDAO;
ExecutorService executor;
Handler handler;

public ProductDAO getProductDAO(){
return productDAO;
}

public Repository(Application application) {
POSDatabase posDatabase = POSDatabase.getInstance(application);
this.productDAO = posDatabase.getProductDAO();
executor = Executors.newSingleThreadExecutor();
handler = new Handler(Looper.getMainLooper());
}

public void insertProduct(Product product){
executor.execute(new Runnable() {
@Override
public void run() {
productDAO.insert(product);
}
});
}

public void deleteProduct(Product product){
executor.execute(new Runnable() {
@Override
public void run() {
productDAO.delete(product);
}
});
}

public void updateProducts(List products){
executor.execute(new Runnable() {
@Override
public void run() {
productDAO.updateProducts(products);
}
});
}

public LiveData getCorrespondingInnerProducts(String outerProduct){
return productDAO.getCorrespondingInnerProducts(outerProduct);
}

public LiveData getAllProducts(){
return productDAO.getAll();
}
< /code>
} `< /p>
Часть моего класса ViewModel. Слишком долго, чтобы показать все: < /p>
`private livedata conchanormal;
private Repository myrepository; < /p>
public POSViewModel(@NonNull Application application){
super(application);
this.myRepository = new Repository(application);
this.conchaNormal = this.myRepository.getCorrespondingInnerProducts("concha normal");

}
< /code>
public livedata getConChanorMal () {
return Conchanormal;
} `< /p>
Итак, в функции Oncreatevie Получен из предварительной базы данных) просто хорошо. Если я запускаю следующий код: < /p>
'LiveData test = posViewModel.getConchaNormal();
if(test.getValue() != null){
Log.i("Miguel", "From Live Data: Number of Conchas normal size " + test.getValue().size());
}
else{
Log.i("Miguel", "I was correct with the error.");
}'
< /code>
Я захожу в верхнюю часть оператора if (test.getValue ()! = NULL) является правдой и в журналах 'из живых данных: количество CONCHAS Нормальный размер 4' < /p>
Но (вот мой вопрос): когда я запускаю этот точный код в функции на функции MainActivity. Включая, что у меня есть еще одно действие, в котором в нем есть другой фрагмент, и в этом фрагменте, если я запускаю один и тот же код в рамках этого фрагмента, я также получаю test.getValue (), равный null. < /P>
Почему я не могу получить эту информацию в этих двух последних местах кода? Просто чтобы сообщить вам, где test.getValue () не является null i, Recyclerview показывает эту информацию. Но в последних местах нет никаких объектов представления, показывающих эту информацию. Заранее спасибо.>

Подробнее здесь: https://stackoverflow.com/questions/796 ... pulated-ro
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»