У меня возникла следующая проблема: я почти уверен, что код чистый, но все же эмулятор не показывает данные, которые я пытаюсь сохранить. Я все проверил дважды и не могу понять, что это. Может у вас есть идея.
Вот мой класс AppDatabase:
@Database(entities = {Projekt.class}, version = 1, exportSchema = false)
@TypeConverters({Converters.class}) public abstract class AppDatabase
extends RoomDatabase {
public abstract RoomDAO getRoomDAO();
}
Вот мой интерфейс DAO:
@Dao
public interface RoomDAO {
@Insert
public void insert(Projekt... projekte);
@Update
public void update(Projekt... projekte);
@Delete
public void delete(Projekt... projekte);
@Query("SELECT * FROM projekt")
public List<Projekt> getProjektname();
@Query("SELECT * FROM projekt WHERE standort= :name")
public Projekt getProjektWithId(String name);
}
Вот моя MainActivity:
private static final int CREATE_PROJEKT = 1;
private static final int UPDATE_PROJEKT = 2;
private RoomDAO mRoomDAO;
private RecyclerView ProjekteRecyclerview;
private ProjektRecyclerAdapter mProjektRecyclerAdapter;
private FloatingActionButton mAddProjektFloatingActionButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRoomDAO = Room.databaseBuilder(this, AppDatabase.class, "db-projekte")
.allowMainThreadQueries()
.build()
.getRoomDAO();
ProjekteRecyclerview = findViewById(R.id.ProjektRecyclerView);
ProjekteRecyclerview.setLayoutManager(new LinearLayoutManager(this));
mAddProjektFloatingActionButton = findViewById(R.id.addProjektFloatingActionButton);
int colors [] = {ContextCompat.getColor(this, R.color.colorAccent),
ContextCompat.getColor(this, android.R.color.holo_red_light),
ContextCompat.getColor(this, android.R.color.holo_orange_light),
ContextCompat.getColor(this, android.R.color.holo_green_light),
ContextCompat.getColor(this, android.R.color.holo_blue_dark),
ContextCompat.getColor(this, android.R.color.holo_purple)};
mProjektRecyclerAdapter = new ProjektRecyclerAdapter(this, new ArrayList<Projekt>(), colors);
mProjektRecyclerAdapter.addActionCallback(new ProjektRecyclerAdapter.ActionCallback() {
@Override
public void onLongClickListener(Projekt projekt) {
Intent intent = new Intent (MainActivity.this, UpdateProjektActivity.class);
intent.putExtra(UpdateProjektActivity.EXTRA_PROJEKT_ID, projekt.getStandort());
startActivityForResult(intent, UPDATE_PROJEKT);
}
});
ProjekteRecyclerview.setAdapter(mProjektRecyclerAdapter);
mAddProjektFloatingActionButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, CreateProjektActivity.class);
startActivityForResult(intent, CREATE_PROJEKT);
}
});
loadProjekte();
}
private void loadProjekte(){
mProjektRecyclerAdapter.updateData(mRoomDAO.getProjektname());
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CREATE_PROJEKT && resultCode == RESULT_OK){
loadProjekte();
} else if (requestCode == UPDATE_PROJEKT && resultCode == RESULT_OK){
loadProjekte();
}
}
}
Вот мой RecylcerAdapter, думаю где-то тут проблема.
public class ProjektRecyclerAdapter extends RecyclerView.Adapter<ProjektRecyclerAdapter.ViewHolder> {
interface ActionCallback {
void onLongClickListener(Projekt projekt);
}
private Context context;
private List<Projekt> projektList;
private int[] colors;
private ActionCallback mActionCallback;
ProjektRecyclerAdapter(Context context, List<Projekt> projektList, int[] colors){
this.context = context;
this.projektList = projektList;
this.colors = colors;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
View view = LayoutInflater.from(context).inflate(R.layout.item_recylcer_projekt, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.bindData(position);
}
@Override
public int getItemCount() {
return projektList.size();
}
void updateData(List<Projekt> projekte){
this.projektList = projekte;
notifyDataSetChanged();
}
//ViewHolder Class
class ViewHolder extends RecyclerView.ViewHolder implements View.OnLongClickListener{
private TextView mNameTextView;
private TextView mInitialsTextView;
private GradientDrawable mInitialsBackground;
ViewHolder(View itemView){
super(itemView);
itemView.setOnLongClickListener(this);
mInitialsTextView = itemView.findViewById(R.id.initialsTextView);
mNameTextView = itemView.findViewById(R.id.nameTextView);
mInitialsBackground = (GradientDrawable) mInitialsTextView.getBackground();
}
void bindData(int position){
Projekt projekt = projektList.get(position);
String fullName = projekt.getProjektname() + " " + projekt.getArbeitername();
mNameTextView.setText(fullName);
String initial = projekt.getProjektname().toUpperCase().substring(0, 1);
mInitialsTextView.setText(initial);
mInitialsBackground.setColor(colors[position % colors.length]);
}
@Override
public boolean onLongClick(View v) {
if (mActionCallback != null){
mActionCallback.onLongClickListener(projektList.get(getAdapterPosition()));
}
return true;
}
}
void addActionCallback(ActionCallback actionCallbacks){
mActionCallback = actionCallbacks;
}
}
А вот и мой buil.gradle:
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
defaultConfig {
applicationId "com.adesso.lklein.roomcontacttest"
minSdkVersion 16
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
implementation 'android.arch.persistence.room:runtime:1.0.0'
annotationProcessor "android.arch.persistence.room:compiler:1.0.0"
implementation 'com.android.support:design:27.0.2'
}
Сборка в порядке, ошибок и предупреждений нет. Даже в Logcat ничего не отображается, когда я нажимаю кнопку «Сохранить». Любая идея, что это такое?
projekt.setStandort (стандартный); projekt.setCreatedDate (новая дата ()); // вставить в базу данных mRoomDAO.insert (projekt); setResult (RESULT_OK); финиш();
Попробуйте так .. и измените код в соответствии с .. сделать активность на уровне приложения, как показано ниже
public class AppActivity extends Application {
static AppDatabase db;
@Override
public void onCreate() {
super.onCreate();
db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "database-name").build();
}
public static AppDatabase getDatabase() {
return db;
}
}
и это действие определяется в файле манифеста Android в теге приложения .. как показано ниже ..
android:name = ".db.AppActivity"
после этого сделать базу данных ..
@Database(entities = {MyTable.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract MyTableDao getTableDao();
}
сделать дао ..
@Dao
public interface MyTableDao {
@Insert
void insertData(MyTable myTable);
@Query("SELECT * FROM MyTable where id=:id and ItemPrice=:price")
List<MyTable> getData(int id,int price);
}
и после этого выполните операцию db, как показано ниже ..
AppActivity.getDatabase().getTableDao().insertData(user); // pass object
когда я пытаюсь вставить действие в manifest.xml, он показывает мне, что «.db.AppActivity не может быть назначен для android.app.Activity» Проверяет ссылки на ресурсы в файлах android xml »какие-либо предложения?
Можете добавить код, где звоните
RoomDAO.insert()?