mSaveAircraftButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Aircraft aircraft = new Aircraft();
aircraft.setAircraftId(mEditSn.getText().toString());
aircraft.setBoecg(Float.parseFloat(mEditBOECG.getText().toString()));
aircraft.setBoew(Float.parseFloat(mEditBOEW.getText().toString()));
aircraft.setCycles(Integer.parseInt(mEditCycles.getText().toString()));
aircraft.setDatum(Float.parseFloat(mEditDatum.getText().toString()));
aircraft.setAircraftType(mEditAt.getText().toString());
aircraft.setHobbs(Float.parseFloat(mEditHobbs.getText().toString()));
aircraft.setEngineLocation(Integer.parseInt(mEditEngLoc.getText().toString()));
aircraft.setMlw(Integer.parseInt(mEditMLW.getText().toString()));
aircraft.setMrw(Integer.parseInt(mEditMRW.getText().toString()));
aircraft.setMtow(Integer.parseInt(mEditMTOW.getText().toString()));
aircraft.setMzfw(Integer.parseInt(mEditMZFW.getText().toString()));
mAircraftViewModel.insert();
Toast.makeText(mContext, "Aircraft added to Database", Toast.LENGTH_LONG).show();
Log.w("Tatenda","Added Aircraft Name");
// mAircraft.getAircraftType(mEditAt.getText().toString());
}
});
package com.example.mafv5;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;
import androidx.sqlite.db.SupportSQLiteDatabase;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@Database(entities = {Aircraft.class,FuelTank.class, Performance.class, PaxZone.class, CargoZone.class, }, version = 1, exportSchema = false)
public abstract class MafRoomDatabase extends RoomDatabase {
public static final int FLIGHT_PLAN_VM = 1;
public MafRoomDatabase(AircraftActivity aircraftActivity) {
}
public abstract AircraftDao aircraftDao();
public abstract FuelTankDao fuelTankDao();
public abstract PerformanceDao performanceDao();
public abstract PaxZoneDao paxZoneDao();
public abstract CargoZoneDao cargoZoneDao();
// public abstract AirportDao airportDao();
// public abstract FlightPlanDao flightPlanDao();
// public abstract PersonDao personDao();
// public abstract PaxFlightRequest paxFlightRequestDao();
// public abstract BaggageDao baggageDao();
// public abstract PilotDao pilotDao();
// public abstract PrePostFlightDao prePostFlightDao();
public MafRoomDatabase() {
}
//this will be set by keaton when he updates: almost assuredly on a non UI thread
public static volatile boolean[] isInvalid;
private static boolean[] isLive;
private static final int NUM_VIEW_MODELS = 10;
public static final int AIRCRAFT_VM = 0;
// marking the instance as volatile to ensure atomic access to the variable
private static volatile MafRoomDatabase INSTANCE;
private static final int NUMBER_OF_THREADS = 4;
static final ExecutorService databaseWriteExecutor =
Executors.newFixedThreadPool(NUMBER_OF_THREADS);
public static MafRoomDatabase getDatabase(final Context context) {
if (INSTANCE == null) {
synchronized (MafRoomDatabase.class) {
if (INSTANCE == null) {
Callback sRoomDatabase = null;
INSTANCE = Room.databaseBuilder(context.getApplicationContext(), MafRoomDatabase.class, "aircraft_database").
addCallback(sRoomDatabase)
.allowMainThreadQueries()
.build();
isLive = new boolean[NUM_VIEW_MODELS];
isInvalid = new boolean[NUM_VIEW_MODELS];
}
}
}
return INSTANCE;
}
private static MafRoomDatabase.Callback sRoomDatabaseCallback = new MafRoomDatabase.Callback() {
@Override
public void onOpen(@NonNull SupportSQLiteDatabase db) {
super.onOpen(db);
}
};
public static boolean isLive(int viewModel) {
boolean rc = false;
if (viewModel < NUM_VIEW_MODELS) {
rc = isLive[viewModel];
}
return rc;
}
public static boolean isInvalid(int viewModel) {
boolean rc = false;
if (viewModel < NUM_VIEW_MODELS) {
rc = isInvalid[viewModel];
}
return rc;
}
public static void setIsLive(int viewModel, boolean isLive) {
if (viewModel < NUM_VIEW_MODELS) {
MafRoomDatabase.isLive[viewModel] = isLive;
}
}
public static void setIsInvalid(int viewModel, boolean isInvalid) {
if (viewModel < NUM_VIEW_MODELS) {
MafRoomDatabase.isInvalid[viewModel] = isInvalid;
}
}
//set all live viewmodels to invalid viewmodels by copying isLive[] into isInvalid[]
public static void setAllInvalid() {
System.arraycopy(isLive, 0, isInvalid, 0, NUM_VIEW_MODELS);
}
}
`
public class AircraftRepository {
private AircraftDao mAircraftDao;
private FuelTankDao mFuelTankDao;
private PaxZoneDao mPaxZoneDao;
private CargoZoneDao mCargoZoneDao;
private PerformanceDao mPerformanceDao;
private Aircraft mAircraft;
private FuelTank mFuelTank;
private CargoZone mCargoZone;
private PaxZone mPaxZone;
//private List<PaxZoneList> mPaxZoneList;
//private List<CargoZoneList> mCargoZoneList;
//private List<AircraftList> mAircraftList;
public AircraftRepository(Application application) {
MafRoomDatabase db = MafRoomDatabase.getDatabase(application);
mAircraftDao = db.aircraftDao();
mFuelTankDao = db.fuelTankDao();
mPaxZoneDao = db.paxZoneDao();
mCargoZoneDao = db.cargoZoneDao();
mPerformanceDao = db.performanceDao();
}
public void sync(final AircraftActivityCallback aircraftActivityCallback,
final AircraftViewModelCallback aircraftViewModelCallback, final String aircraftId) {
MafRoomDatabase.databaseWriteExecutor.execute(new Runnable() {
@Override
public void run() {
mAircraft = mAircraftDao.selectAircraftById(aircraftId);
mFuelTank = mAircraftDao.selectFuelTankById(aircraftId);
// mCargoZone.setCargoZoneId(cargoId);
aircraftViewModelCallback.aircraftViewModelCallback(aircraftActivityCallback, mAircraft);
if (mAircraft!= null) {
if (mAircraft.getAircraftId() != null) {
mAircraft = mAircraftDao.selectAircraftById(mAircraft.getAircraftId());
}
if (mAircraft !=null){
mFuelTank = mFuelTankDao.selectFuelTankById(mFuelTank.getFuelTankId());
// mAircraft = mAircraftDao.selectCargoZoneById(Integer.parseInt(mAircraft.getAircraftId()));
}
// if(mAircraft.getPaxZoneId()!= null){
// mPaxZone = mAircraftDao.selectPaxZoneById(mAircraft.)
//}
}
}
});
}
public void insert(final AircraftActivityCallback aircraftActivityCallback,
final Aircraft aircraft,
final CargoZone cargoZone,
final PaxZone paxZone,
final FuelTank fuelTank,
final Performance performance){
MafRoomDatabase.databaseWriteExecutor.execute(new Runnable() {
@Override
public void run() {
}
});
}
public void insert(final Aircraft aircraft) {
MafRoomDatabase.databaseWriteExecutor.execute(new Runnable() {
@Override
public void run() {
mAircraftDao.insert(aircraft);
}
});
}
public void insert(final FuelTank fuelTank){
MafRoomDatabase.databaseWriteExecutor.execute(new Runnable() {
@Override
public void run() {
mFuelTankDao.insert(fuelTank);
}
});
}
public void insert(final PaxZone paxZone){
MafRoomDatabase.databaseWriteExecutor.execute(new Runnable() {
@Override
public void run() {
mPaxZoneDao.insert(paxZone);
}
});
}
public void insert (final CargoZone cargoZone){
MafRoomDatabase.databaseWriteExecutor.execute(new Runnable() {
@Override
public void run() {
mCargoZoneDao.insert(cargoZone);
}
});
}
public void insert(final Performance performance){
MafRoomDatabase.databaseWriteExecutor.execute(new Runnable() {
@Override
public void run() {
mPerformanceDao.insert(performance);
}
});
}
public void insertPerformanceList(final List<Performance> performanceList) {
MafRoomDatabase.databaseWriteExecutor.execute(new Runnable() {
@Override
public void run() {
for (int i = 0; i < performanceList.size(); i++) {
mAircraftDao.insert(performanceList.get(i));
}
}
});
}
public void update(final Aircraft aircraft) {
MafRoomDatabase.databaseWriteExecutor.execute(new Runnable() {
@Override
public void run() {
mAircraftDao.update(aircraft);
}
});
}
public void update(final FuelTank fuelTank){
MafRoomDatabase.databaseWriteExecutor.execute(new Runnable() {
@Override
public void run() {
mFuelTankDao.update(fuelTank);
}
});
}
public void update(final PaxZone paxZone){
MafRoomDatabase.databaseWriteExecutor.execute(new Runnable() {
@Override
public void run() {
mPaxZoneDao.update(paxZone);
}
});
}
public void update(final CargoZone cargoZone){
MafRoomDatabase.databaseWriteExecutor.execute(new Runnable() {
@Override
public void run() {
mCargoZoneDao.update(cargoZone);
}
});
}
public void update(final Performance performance){
MafRoomDatabase.databaseWriteExecutor.execute(new Runnable() {
@Override
public void run() {
mPerformanceDao.update(performance);
}
});
}
public void deleteAll() {
MafRoomDatabase.databaseWriteExecutor.execute(new Runnable() {
@Override
public void run() {
mAircraftDao.deleteAll();
mPerformanceDao.deleteAll();
mCargoZoneDao.deleteAll();
}
});
}
}
`
package com.example.mafv5;
import androidx.room.Dao;
import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.Update;
@Dao
public interface AircraftDao {
@Query("DELETE FROM aircraft")
void deleteAll();
@Insert
void insert(Aircraft aircraft);
@Insert
long insert(Performance performance);
@Insert
long insert(PaxZone paxZone);
@Insert
long insert(CargoZone cargoZone);
@Insert
long insert(FuelTank fuelTank);
@Update
void update(Aircraft aircraft);
@Update
void update(Performance performance);
@Update
void update(PaxZone paxZone);
@Update
void update(CargoZone cargoZone);
@Update
void update(FuelTank fuelTank);
//@Update(entity = Aircraft.class)
// void update(FlightPlanUpdateIsCancelled flightPlanUpdateIsCancelled);
@Query("SELECT * FROM aircraft WHERE aircraft_id=:aircraftId")
Aircraft selectAircraftById(String aircraftId);
@Query("SELECT * FROM fuel_tank WHERE aircraft_id=:aircraftId")
FuelTank selectFuelTankById(String aircraftId);
@Query("SELECT * FROM cargo_zone WHERE cargo_zone_id=:cargoZoneId")
CargoZone selectCargoZoneById(int cargoZoneId);
@Query("SELECT * FROM pax_zone WHERE pax_zone_id=:paxZoneId")
PaxZone selectPaxZoneById(int paxZoneId);
@Query("SELECT * FROM performance WHERE performance_id=:performanceZoneId")
Performance selectPerformanceById(int performanceZoneId);
}
`
错误:
2020-11-01 03:02:58.401 7611-7665 / com.example.mafv5 E / AndroidRuntime:FATAL EXCEPTION:pool-2-thread-1 流程:com.example.mafv5,PID:7611 java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'void androidx.room.RoomDatabase $ Callback.onCreate(androidx.sqlite.db.SupportSQLiteDatabase)' 在com.example.mafv5.MafRoomDatabase_Impl $ 1.onCreate(MafRoomDatabase_Impl.java:76) 在androidx.room.RoomOpenHelper.onCreate(RoomOpenHelper.java:87) 在androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper $ OpenHelper.onCreate(FrameworkSQLiteOpenHelper.java:118) 在android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:411) 在android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:316) 在androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper $ OpenHelper.getWritableSupportDatabase(FrameworkSQLiteOpenHelper.java:92) 在androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase(FrameworkSQLiteOpenHelper.java:53) 在androidx.room.RoomDatabase.inTransaction(RoomDatabase.java:476) 在androidx.room.RoomDatabase.assertNotSuspendingTransaction(RoomDatabase.java:281) 在com.example.mafv5.AircraftDao_Impl.insert(AircraftDao_Impl.java:612) 在com.example.mafv5.AircraftRepository $ 3.run(AircraftRepository.java:73) 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:641) 在java.lang.Thread.run(Thread.java:923)