我将使用日期选择器片段选择的日期保存到我的数据库时遇到问题

问题描述 投票:0回答:1

我有这个问题,保存我在数据库中的字符串变量中选择的日期

我已经尝试使用正斜杠格式化保存并且没有格式化为整数,但这些都没有为我解决我在RecyclerView中有这样的事情列表,当你点击其中一个时,它给出了一个列表详细信息和选择的日期是其中之一我还卸载了应用程序并再次安装它以避免数据库中的任何混淆

这是我的DataBaseHandler.java类:

public class DatabaseHandler extends SQLiteOpenHelper {
    Context ctx;
    public DatabaseHandler(Context context) {
        super(context, Constants.DB_NAME, null,Constants.DB_VERSION);
        ctx = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_TABLE = "CREATE TABLE "+ Constants.DB_TABLE + "(" +Constants.KEY_ID +
                " INTEGER PRIMARY KEY ," + Constants.KEY_MANUF
                +" TEXT ," + Constants.KEY_NAME +" TEXT ,"+ Constants.KEY_MODEL +" INTEGER ,"+
                Constants.KEY_IMAGE+" TEXT ," + Constants.KEY_MILEAGE +" TEXT ,"+ Constants.KEY_OILDATE +" TEXT );";
        db.execSQL(CREATE_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS "+Constants.DB_TABLE);
        onCreate(db);
    }
    public void addCar(Cars carro){
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        // todo: try flipping them for errors
        values.put(Constants.KEY_NAME,carro.getCarName());
        values.put(Constants.KEY_MODEL,carro.getCarModel());
        values.put(Constants.KEY_MANUF,carro.getCarManuf());
        values.put(Constants.KEY_IMAGE,carro.getCarImage());
        values.put(Constants.KEY_MILEAGE,carro.getCarMileage());
        values.put(Constants.KEY_OILDATE,carro.getCarOilDate());
        // the insertion of the row
        db.insert(Constants.DB_TABLE,null,values);
    }
    // get the cars
    public Cars getCars(int id){
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor miCursor = db.query(Constants.DB_TABLE,new String[]{Constants.KEY_ID,Constants.KEY_MANUF,Constants.KEY_NAME,Constants.KEY_MODEL,Constants.KEY_IMAGE}
        ,Constants.KEY_ID + "=?",new String[]{String.valueOf(id)},null,null,null,null);
        if (miCursor != null)
            miCursor.moveToFirst();

            Cars miCarro = new Cars();
            miCarro.setCarID(Integer.parseInt(miCursor.getString(miCursor.getColumnIndex(Constants.KEY_ID))));
            miCarro.setCarManuf(miCursor.getString(miCursor.getColumnIndex(Constants.KEY_MANUF)));
            miCarro.setCarName(miCursor.getString(miCursor.getColumnIndex(Constants.KEY_NAME)));
            miCarro.setCarModel(miCursor.getString(miCursor.getColumnIndex(Constants.KEY_MODEL)));
            miCarro.setCarImage(miCursor.getString(miCursor.getColumnIndex(Constants.KEY_IMAGE)));
            miCarro.setCarMileage(miCursor.getString(miCursor.getColumnIndex(Constants.KEY_MILEAGE)));
            miCarro.setCarOilDate(miCursor.getString(miCursor.getColumnIndex(Constants.KEY_OILDATE)));
            return miCarro;
    }
    //list all cars
    public List<Cars> getAllCars(){
        SQLiteDatabase db = this.getReadableDatabase();
        List<Cars> misCarros= new ArrayList<>();
        Cursor miCursor = db.query(Constants.DB_TABLE,new String[]{Constants.KEY_ID,Constants.KEY_MANUF,Constants.KEY_NAME,Constants.KEY_MODEL,Constants.KEY_IMAGE,Constants.KEY_MILEAGE,Constants.KEY_OILDATE}
                ,null,null,null,null,Constants.KEY_MANUF+" ASC;");
        if (miCursor.moveToFirst())
        {
            do{
                Cars miCarro = new Cars();
                miCarro.setCarID(miCursor.getInt(miCursor.getColumnIndex(Constants.KEY_ID)));
                miCarro.setCarManuf(miCursor.getString(miCursor.getColumnIndex(Constants.KEY_MANUF)));
                miCarro.setCarName(miCursor.getString(miCursor.getColumnIndex(Constants.KEY_NAME)));
                miCarro.setCarModel(miCursor.getString(miCursor.getColumnIndex(Constants.KEY_MODEL)));
                miCarro.setCarImage(miCursor.getString(miCursor.getColumnIndex(Constants.KEY_IMAGE)));
                miCarro.setCarMileage(miCursor.getString(miCursor.getColumnIndex(Constants.KEY_MILEAGE)));
                miCarro.setCarOilDate(miCursor.getString(miCursor.getColumnIndex(Constants.KEY_OILDATE)));
                // add the shitty Car to the big list :)
                misCarros.add(miCarro);
            }while(miCursor.moveToNext());
        }
        return misCarros;
    }
    //update Cars
    public int updateCars(Cars carros){
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        // todo: try flipping them for errors
        values.put(Constants.KEY_MANUF,carros.getCarManuf());
        values.put(Constants.KEY_NAME,carros.getCarName());
        values.put(Constants.KEY_MODEL,carros.getCarModel());
        values.put(Constants.KEY_IMAGE,carros.getCarImage());
        values.put(Constants.KEY_MILEAGE,carros.getCarMileage());
        values.put(Constants.KEY_OILDATE,carros.getCarOilDate());
        return db.update(Constants.DB_TABLE,values,Constants.KEY_ID + "=?",new String[] {String.valueOf(carros.getCarID())});
    }
    //delete cars
    public void deleteCars(int id){
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(Constants.DB_TABLE,Constants.KEY_ID + "=?",new String[] {String.valueOf(id)});
        db.close();
    }
    //get cars count
    public int getCarsCount(){
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor miCursor = db.rawQuery("SELECT * FROM "+Constants.DB_TABLE,null);
        return miCursor.getCount();
    }
}

这是我的RecyclerViewAdapter.java文件:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
    private Context context;
    private List<Cars> misCarros;
    private AlertDialog dialog;
    private AlertDialog.Builder alertBuilder;
    private static final int REQUEST_IMAGE_CAPTURE=1;
    public boolean clicked = false;
    public RecyclerViewAdapter(Context context, List<Cars> misCarros) {
        this.context = context;
        this.misCarros = misCarros;
    }

    public RecyclerViewAdapter() {
    }

    @NonNull
    @Override
    public RecyclerViewAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.list_row,parent,false);
        return new ViewHolder(view,context);
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerViewAdapter.ViewHolder holder, int position) {
        Cars carro = misCarros.get(position);
        Bitmap pic;
        if(carro.getCarImage() != null) {
            pic = BitmapFactory.decodeFile(carro.getCarImage());
            holder.ImagenaDelCarro.setImageBitmap(pic); }
        holder.ManufacturarDelCarro.setText(carro.getCarManuf());
        holder.NombreDelCarro.setText(carro.getCarName());
        holder.ModelDelCarro.setText(carro.getCarModel());
    }

    @Override
    public int getItemCount() {
        return misCarros.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        public TextView ManufacturarDelCarro;
        public TextView NombreDelCarro;
        public TextView ModelDelCarro;
        public ImageView ImagenaDelCarro;
        public Button editarElCarro;
        public Button deletarElCarro;
        public int id;
        public ViewHolder(View view, final Context ctx) {
            super(view);
            context = ctx;
            ManufacturarDelCarro = view.findViewById(R.id.carManuf);
            NombreDelCarro = view.findViewById(R.id.carName);
            ModelDelCarro = view.findViewById(R.id.carDOB);
            ImagenaDelCarro = view.findViewById(R.id.carImage);
            editarElCarro = view.findViewById(R.id.editCarID);
            deletarElCarro = view.findViewById(R.id.deleteCarID);
            editarElCarro.setOnClickListener(this);
            deletarElCarro.setOnClickListener(this);
            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int position = getAdapterPosition();
                    Cars car = misCarros.get(position);
                    Intent miIntento = new Intent(ctx, DetailsActivity.class);
                    miIntento.putExtra("name", car.getCarName());
                    miIntento.putExtra("model", car.getCarModel());
                    miIntento.putExtra("manuf", car.getCarManuf());
                    miIntento.putExtra("position", car.getCarID());
                    miIntento.putExtra("imagePath",car.getCarImage());
                    miIntento.putExtra("mileage",car.getCarMileage());
                    miIntento.putExtra("oilChangeDate",car.getCarOilDate());
                    ctx.startActivity(miIntento);

                }
            });

        }
        @Override
        public void onClick(View v) {
            switch (v.getId())
            {
                case R.id.editCarID:
                    Cars unCarro = misCarros.get(getAdapterPosition());
                    editCar(unCarro);
                    break;
                case R.id.deleteCarID:
                    int position = getAdapterPosition();
                    unCarro = misCarros.get(position);
                    deleteCar(unCarro.getCarID());
                    break;
            }

        }
        public void deleteCar (final int id)
        {
            final DatabaseHandler db = new DatabaseHandler(context);
            alertBuilder = new AlertDialog.Builder(context);
            alertBuilder.setTitle(R.string.confTitle);
           // alertBuilder.setIcon(android.R.drawable.alert_dark_frame);
            alertBuilder.setMessage(R.string.confMsg);
            alertBuilder.setNegativeButton(R.string.noBu, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });
            alertBuilder.setPositiveButton(R.string.yesBu, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    db.deleteCars(id);
                    misCarros.remove(getAdapterPosition());
                    notifyItemRemoved(getAdapterPosition());
                    dialog.dismiss();
                    if (db.getCarsCount() <= 0)
                    {
                        context.startActivity(new Intent(context,MainActivity.class));
                        ((Activity)context).finish();
                    }
                }
            });
            dialog = alertBuilder.create();
            dialog.show();

        }
        public void editCar(final Cars car)
        {
            alertBuilder = new AlertDialog.Builder(context);
            LayoutInflater inflater = LayoutInflater.from(context);
            final View view = inflater.inflate(R.layout.new_car_popup,null);
            final EditText carName = view.findViewById(R.id.nCarName);
            final EditText carManuf = view.findViewById(R.id.nCarManuf);
            final EditText DOB = view.findViewById(R.id.nCarDOB);
            TextView editCarText = view.findViewById(R.id.textView);
            Button editImage = view.findViewById(R.id.addImageID);
            final ImageView carImage = view.findViewById(R.id.laImagenaPuta);
            final Button editCarButton = view.findViewById(R.id.addCarID);
            editImage.setText(R.string.editImageText);
            editCarButton.setText(R.string.editCarBu);
            editCarText.setText(R.string.editCarText);
            carManuf.setHint(R.string.manufHint);
            carName.setHint(R.string.nameHint);
            DOB.setHint(R.string.DOBHint);
            final SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
            alertBuilder.setView(view);
            dialog = alertBuilder.create();
            dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
            dialog.show();
            SharedPreferences.Editor editor = sharedPreferences.edit();
            if(!clicked)
                editor.putString("imagePath",null);
            editor.apply();
            long time = SystemClock.currentThreadTimeMillis();
            editImage.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    try{
                        if (ActivityCompat.checkSelfPermission(context,Manifest.permission.READ_EXTERNAL_STORAGE)
                                != PackageManager.PERMISSION_GRANTED){
                            ActivityCompat.requestPermissions((Activity)context, new String[]{
                                            Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE},
                                    REQUEST_IMAGE_CAPTURE);
                        }else {
                            clicked = true;
                            Intent helperIntent = new Intent(context,IntentHelperActivity.class);
                            startActivity(context,helperIntent,null);
                            new Handler().postDelayed(new Runnable() {

                                @Override
                                public void run() {
                                    Bitmap image = BitmapFactory.decodeFile(sharedPreferences.getString("imagePath", null));
                                    carImage.setImageBitmap(image);
                                }
                            }, 1690);
                        }
                    }catch (Exception e)
                    {
                        e.printStackTrace();
                    }
                }
            });
            editCarButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    final String imagePath = sharedPreferences.getString("imagePath", null);
                    DatabaseHandler db = new DatabaseHandler(context);
                    if(!carManuf.getText().toString().isEmpty())
                        car.setCarManuf(carManuf.getText().toString());
                    if(!carName.getText().toString().isEmpty())
                        car.setCarName(carName.getText().toString());
                    if(!DOB.getText().toString().isEmpty())
                        car.setCarModel(DOB.getText().toString());
                    if(imagePath != null)
                        car.setCarImage(imagePath);
                    db.updateCars(car);
                    notifyItemChanged(getAdapterPosition(), car);
                    dialog.dismiss();
                    Intent myIntent = new Intent(context,ListActivity.class);
                    context.startActivity(myIntent);
                    ((Activity)context).finish();
                    ((Activity) context).finish();

                }
            });

        }
    }
}

这是我的DatePickerFragment.java类

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener{
    private static int year;
    private static int month;
    private static int day;
    private Cars car;
    private DatabaseHandler db;
    private Bundle miBundle;

    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        // Declaring Car object to use it to update the car's Oil change Date
        db =  new DatabaseHandler(getActivity().getApplicationContext());
        miBundle = getActivity().getIntent().getExtras();
        car = new Cars();
        car.setCarID(miBundle.getInt("position"));
        car.setCarName((String) miBundle.get("name"));
        car.setCarManuf((String) miBundle.get("manuf"));
        car.setCarModel((String) miBundle.get("model"));
        car.setCarMileage((String) miBundle.get("mileage"));
        car.setCarImage((String) miBundle.get("imagePath"));
        car.setCarOilDate(miBundle.getString("oilChangeDate"));
        final Calendar calendar = Calendar.getInstance();
        year = calendar.get(Calendar.YEAR);
        month = calendar.get(Calendar.MONTH);
        day = calendar.get(Calendar.DAY_OF_MONTH);
        return new DatePickerDialog(getActivity(),this,year,month,day);
    }
    @Override
    public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
        TextView tv = getActivity().findViewById(R.id.oilChangeID);
        String formattedDate = year+" / "+ (month+1)+" / " +dayOfMonth;
        String unFormattedDate = ("f"+year+(month+1)+dayOfMonth+"f");
        tv.setText(formattedDate);
        car.setCarOilDate(unFormattedDate);
        db.updateCars(car);
        miBundle.putString("oilChangeDate",unFormattedDate);
        Intent intent = new Intent(getActivity(),DetailsActivity.class);
        intent.putExtras(miBundle);
        getActivity().finish();
        getActivity().startActivity(intent);
    }
}

最后这是我的DetailsActivity.java类:

public class DetailsActivity extends AppCompatActivity {
    private static final int REQUEST_DATE = 1;
    private static final int REQUEST_CODE = 1;
    private TextView nameDet;
    private TextView manufDet;
    private TextView modelDet;
    private ImageView imgDet;
    private Bitmap getImg;
    private TextView mileage;
    private TextView oilChangeDate;
    private Cars car;
    private int id;
    private AlertDialog dialog;
    private DatabaseHandler db;
    private AlertDialog.Builder alertBuilder;
    private Bundle miBundle;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_details);
        miBundle = getIntent().getExtras();
        nameDet = findViewById(R.id.carNameDet);
        manufDet = findViewById(R.id.carManufDet);
        modelDet = findViewById(R.id.carDOBDet);
        imgDet = findViewById(R.id.carImageDet);
        mileage = findViewById(R.id.mileage);
        oilChangeDate = findViewById(R.id.oilChangeID);
        db = new DatabaseHandler(this);
        if (miBundle != null )
        {
            nameDet.setText((String) miBundle.get("name"));
            modelDet.setText(miBundle.getString("model"));
            manufDet.setText(miBundle.getString("manuf"));
            mileage.setText("Mileage : "+miBundle.getString("mileage"));
            oilChangeDate.setText(miBundle.getString("oilChangeDate"));
            if(miBundle.getString("imagePath") != null){
                getImg = BitmapFactory.decodeFile(miBundle.getString("imagePath"));
                imgDet.setImageBitmap(getImg);
                imgDet.setMaxHeight(190);
                imgDet.setMinimumHeight(180);
            }
            id = miBundle.getInt("position");
            car = new Cars();
            car.setCarID(miBundle.getInt("position"));
            car.setCarName((String) miBundle.get("name"));
            car.setCarManuf((String) miBundle.get("manuf"));
            car.setCarModel((String) miBundle.get("model"));
            car.setCarMileage((String) miBundle.get("mileage"));
            car.setCarImage((String) miBundle.get("imagePath"));
            car.setCarOilDate(oilChangeDate.getText().toString());
            db.updateCars(car);
        }

    }

    @Override
    public void onBackPressed() {
        startActivity(new Intent(this,ListActivity.class));
    }

    public void setMileageBu(View view) {
        alertBuilder = new AlertDialog.Builder(this);
        final View myView = getLayoutInflater().inflate(R.layout.set_value,null);
        final EditText mileageValue = myView.findViewById(R.id.nCarMileage);
        Button setMileage = myView.findViewById(R.id.editMileageID);
        alertBuilder.setView(myView);
        miBundle.putString("oilChangeDate",mileageValue.getText().toString());
        dialog =alertBuilder.create();
        dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        dialog.show();
        final Intent intent = new Intent(this,DetailsActivity.class);
        setMileage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                car.setCarMileage(mileageValue.getText().toString());
                db.updateCars(car);
                mileage.setText("Mileage : "+mileageValue.getText().toString());
                miBundle.putString("mileage",mileageValue.getText().toString());
                intent.putExtras(miBundle);
                startActivity(intent,miBundle);
                finish();
                dialog.dismiss();
            }
        });
    }
    public void setOilChangeDate(View view) {
        DialogFragment fragment = new DatePickerFragment();
        fragment.show(getSupportFragmentManager(),"Un puta Date picker");
    }

}

我已经确保RecyclerView在我回到它时会更新,这可以设置里程,但不是在选择日期时。

提前致谢 :)

android android-fragments datepicker android-sqlite android-dialogfragment
1个回答
0
投票

我解决了它,愚蠢的我没有包含ListActivity.java类,这是核心问题。这是onCreate方法

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
//                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
//                        .setAction("Action", null).show();
                createPopupDialog();
            }
        });
        db = new DatabaseHandler(this);
        miRicicler = findViewById(R.id.recyclerViewID);
        miRicicler.setHasFixedSize(true);
        miRicicler.setLayoutManager(new LinearLayoutManager(this));
        listaDeCarros = new ArrayList<>();
        listaDeItems = new ArrayList<>();
        listaDeCarros = db.getAllCars();
        for (Cars x : listaDeCarros)
        {
//            Cars car = new Cars("Manufacturer : " + x.getCarManuf()
//                    ,x.getCarName(),x.getCarID(),"Model : "+x.getCarModel());
           Cars car = new Cars();
           String carManufText = x.getCarManuf();
           String carModelText = x.getCarModel();
           if (carManufText.contains("Manufacturer : "))
               car.setCarManuf(x.getCarManuf());
           else{
               car.setCarManuf("Manufacturer : "+x.getCarManuf());
           }
           car.setCarName(x.getCarName());
           if (carModelText.contains("Model : "))
               car.setCarModel(x.getCarModel());
           else{
               car.setCarModel("Model : " + x.getCarModel());
           }
           car.setCarID(x.getCarID());
           car.setCarImage(x.getCarImage());
           car.setCarMileage(x.getCarMileage());
           car.setCarOilDate(x.getCarOilDate()); //I have solved it by adding this line
           listaDeItems.add(car);
        }

它出现在car.setCarOilDate行上,我忘了先添加它,并认为问题可能是从dialogFragment更新数据库。无论如何,感谢迈克先生的帮助。

© www.soinside.com 2019 - 2024. All rights reserved.