我正在从Firebase中获取一些数据,并尝试将数据保存到同一onDataChange method中的SQLite数据库中。以下是到目前为止我尝试过的代码。我正在将获取的数据保存在String变量中。当我尝试使用Toast时,它显示获取的值,并且当我对String drivername="some value"这样的变量使用硬编码的值时,它会将数据保存到sqlite,但是当我尝试保存获取的数据时值,它返回空值,因此不保存。我在做什么错

    String mobile_no=localSharedPreferences.getSharedPreferences(Constants.PhoneNumber);

    DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Driver");

    reference.orderByKey().equalTo(mobile_no).addValueEventListener(new ValueEventListener() {

        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            String drivermobile=localSharedPreferences.getSharedPreferences(Constants.PhoneNumber);

            for(DataSnapshot datas: dataSnapshot.getChildren()){

                    String drivername = datas.child("d_nme").getValue(String.class);
                    String avatorurl = datas.child("d_avtr").getValue(String.class);
                    String vehicleno = datas.child("v_No").getValue(String.class);
                    String vehiclename = datas.child("v_nme").getValue(String.class);

                   //Toast is showing fetched drivername correctly
                   Toast.makeText(SigninActivity.this, drivername, Toast.LENGTH_SHORT).show();

                //Trying to save into SQLITE

                ContactsDB db = new ContactsDB(getApplicationContext());
                db.open();
                db.createEntry(drivermobile, drivername, vehiclename, avatorurl, vehicleno);
                db.close();


                Toast.makeText(SigninActivity.this, localSharedPreferences.getSharedPreferences(Constants.dDrivername), Toast.LENGTH_SHORT).show();
            }


这是我的ContactsDB类

public class ContactsDB {

public static final String KEY_ROWID="_id";
public static final String DRIVER_MOBILE="driver_mobile";
public static final String DRIVER_NAME="driver_firstname";
public static final String VEHICLE_NAME="vehicle_name";
public static final String AVATOR_URL="driver_avator";
public static final String VEHICLE_NO="vehicle_no";

private final String DATABASE_NAME="ContactsDB";
private final String DATABASE_TABLE="ContactsTable";
private final int DATABASE_VERSION=1;

private DBHelper ourHelper;
private final Context ourContext;
private SQLiteDatabase ourDatabse;

public  ContactsDB(Context context)
{
    ourContext=context;
}

private class DBHelper extends SQLiteOpenHelper
{
    public DBHelper(Context context)
    {
        super(context,DATABASE_NAME,null,DATABASE_VERSION);

    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

        sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
        onCreate(sqLiteDatabase);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {

        /**
         * THIS Only runs if database not exists with specified version
         */

        String sqlcode="CREATE TABLE " + DATABASE_TABLE + " (" +
                KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                DRIVER_MOBILE + " INTEGER NOT NULL, " +
                DRIVER_NAME + " TEXT NOT NULL, " +
                VEHICLE_NAME + " TEXT NOT NULL, " +
                AVATOR_URL + " TEXT NOT NULL, " +
                VEHICLE_NO + " DECIMAL NOT NULL);";

        sqLiteDatabase.execSQL(sqlcode);

    }
}


public ContactsDB open() throws SQLException
{
    ourHelper=new DBHelper(ourContext);
    ourDatabse=ourHelper.getWritableDatabase();
    return this;
}

public void close()
{
    ourHelper.close();
}

public long createEntry(String drivermobile, String drivername, String vehiclename, String avatorurl, String vehicleno) {


    ContentValues cv = new ContentValues();
    cv.put(DRIVER_MOBILE, drivermobile);
    cv.put(DRIVER_NAME,drivername);
    cv.put(VEHICLE_NAME,vehiclename);
    cv.put(AVATOR_URL,avatorurl);
    cv.put(VEHICLE_NO,vehicleno);
    return ourDatabse.insert(DATABASE_TABLE, null, cv);

}

public  String getData()
{
    /*Here you can Specify which column value you want to retrieve*/

    String [] columns=new String[] {KEY_ROWID,DRIVER_MOBILE,DRIVER_NAME,VEHICLE_NAME,AVATOR_URL,VEHICLE_NO};
    Cursor c=ourDatabse.query(DATABASE_TABLE, columns, null,null,null,null,null);

    String result="";

    int iKeyID=c.getColumnIndex(KEY_ROWID);
    int iRowID=c.getColumnIndex(DRIVER_MOBILE);
    int iFirstName=c.getColumnIndex(DRIVER_NAME);
    int iSecondName=c.getColumnIndex(VEHICLE_NAME);
    int iAvatorUrl=c.getColumnIndex(AVATOR_URL);
    int iRatings=c.getColumnIndex(VEHICLE_NO);

    for(c.moveToFirst();!c.isAfterLast();c.moveToNext())
    {

        result=result + c.getString(iKeyID) + ": " + c.getString(iRowID) + ": " + c.getString(iFirstName) + ": " +
                c.getString(iSecondName) + ": " + c.getString(iAvatorUrl) + "+ " +
                c.getString(iRatings) + "\n"; // n is for newline
    }
    c.close();
    return result;

}


public  long deleteEntry(String rowId)
{
    return ourDatabse.delete(DATABASE_TABLE, KEY_ROWID + "=?", new String[]{rowId});
}


public  long updateEntry(String rowId, String drivermobile, String drivername, String vehiclename, String avatorurl, String vehicleno)
{
   ContentValues cv=new ContentValues();

   /*if you update one column then put only one column or put as many as many you want to update*/
   cv.put(DRIVER_MOBILE, drivermobile);
   cv.put(DRIVER_NAME,drivername);
   cv.put(VEHICLE_NAME,vehiclename);
   cv.put(AVATOR_URL,avatorurl);
   cv.put(VEHICLE_NO,vehicleno);
   return ourDatabse.update(DATABASE_TABLE, cv, KEY_ROWID + "=?", new String[]{rowId});
}

最佳答案

我建议您尝试以下方法:

1。

将以下getter方法添加到ContactsDB.java中:

public SQLiteDatabase getOurDatabse() {
    return ourDatabse;
}


2

将打开和关闭分别移动到循环之前和之后,并在循环之前和循环之后还包含一个beginTransaction setTransactionSuccessful和endTransaction。

这样,磁盘将只写入一次,而不是每次插入。

例如:-

public void onDataChange(DataSnapshot dataSnapshot) {

    ContactsDB db = new ContactsDB(getApplicationContext());
    db.open();
    db.getOurDatabse().beginTransaction();


    String drivermobile = localSharedPreferences.getSharedPreferences(Constants.PhoneNumber);

    for (DataSnapshot datas : dataSnapshot.getChildren()) {


        String drivername = datas.child("d_nme").getValue(String.class);
        String avatorurl = datas.child("d_avtr").getValue(String.class);
        String vehicleno = datas.child("v_No").getValue(String.class);
        String vehiclename = datas.child("v_nme").getValue(String.class);

        //Toast is showing fetched drivername correctly
        Toast.makeText(SigninActivity.this, drivername, Toast.LENGTH_SHORT).show();

        //Trying to save into SQLITE

        if (drivermobile != null && drivername != null && vehiclename != null && avatorurl != null && vehicleno != null) {
            if (db.createEntry(drivermobile, drivername, vehiclename, avatorurl, vehicleno) > 0) {
                Toast.makeText(SigninActivity.this, localSharedPreferences.getSharedPreferences(Constants.dDrivername), Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(SigninActivity.this, "?????? Not ADDED", Toast.LENGTH_SHORT).show();
            }
        } else {
            Toast.makeText(SigninActivity.this, "?????? Unable to ADD due to NULL value(s)", Toast.LENGTH_SHORT).show();
        }

    }
    db.getOurDatabse().setTransactionSuccessful();
    db.getOurDatabse().endTransaction();
    db.close();



此外,这还会进行一些检查,以使null值不会导致尝试插入,但会敬告它无法添加该行。
它还检查每个插入的返回值,以查看是否插入了该行以及相应的Toast。


但是,我建议将消息​​而不是Toast(或消息)写入Log会有助于调试。

关于firebase - 如何将数据从Firebase保存到SQLite Android,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59211269/

10-16 09:14
查看更多