android - 从 Recycler 列表中删除但不从 Sqlite 数据库中删除的数据

标签 android sqlite android-recyclerview

我正在开发 android 应用程序,我正在使用 Recycler Adapter 和 Sqlite 数据库来删除和更新 sqlite 数据库。

我的问题是,当我在 Recycler View 中单击要删除的项目时,它会从列表中删除数据,但是当我单击返回并再次打开列表时,已删除的数据仍然存在。

我已经从设备文件资源管理器检查了我的数据库,数据没有从数据库中删除。

同样的事情发生在更新上

这是我的回收器适配器类

public class UserRecyclerAdapterSavedUsers extends RecyclerView.Adapter<UserRecyclerAdapterSavedUsers.UserViewHolder> {

private List<User> listUsers;
Context mContext;
RecyclerView mRecyclerView;
ItemClickListenerLongPressed itemClickListenerLongPressed;
UserRecyclerAdapterSavedUsers userRecyclerAdapterSavedUsers;
View itemView;

public UserRecyclerAdapterSavedUsers(List<User> listUsers,RecyclerView recyclerView) {
    this.listUsers = listUsers;
    mRecyclerView=recyclerView;
}

@Override
public UserViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    mContext= parent.getContext();
    itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.item_user_recycler_second, parent, false);

    return new UserViewHolder(itemView);
}
/**
 * ViewHolder class
 */
public class UserViewHolder extends RecyclerView.ViewHolder {

    //public AppCompatTextView ID;
    public AppCompatTextView textViewID;
    public AppCompatTextView textViewName;
    public AppCompatTextView textViewPassword;
    public AppCompatTextView textViewRole;
    LinearLayout layout;

    public UserViewHolder(View view) {
        super(view);

        textViewID = (AppCompatTextView) view.findViewById(R.id.textViewID);
        textViewName = (AppCompatTextView) view.findViewById(R.id.textViewName);
        textViewPassword = (AppCompatTextView) view.findViewById(R.id.textViewPassword);
        textViewRole = (AppCompatTextView) view.findViewById(R.id.textViewRole);
        layout = (LinearLayout) view.findViewById(R.id.list_view);
    }
}
@Override
public void onBindViewHolder(UserViewHolder holder, final int position) {

    holder.textViewID.setText(listUsers.get(position).getUserid());
    holder.textViewName.setText(listUsers.get(position).getName());
    holder.textViewPassword.setText(listUsers.get(position).getPassword());
    holder.textViewRole.setText(listUsers.get(position).getRole());
    holder.layout.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            displayingAlertDialog(position);
            return false;
        }
    });

}

public void setItemClickListenerLongPressed(ItemClickListenerLongPressed itemClickListenerLongPressed) {
    this.itemClickListenerLongPressed = itemClickListenerLongPressed;
}

@Override
public int getItemCount() {
    Log.v(UsersRecyclerAdapter.class.getSimpleName(),""+listUsers.size());
    return listUsers.size();
}

private void displayingAlertDialog(final int position) {
    final User user= new User();
    //displaying alert dialog box
    AlertDialog.Builder builder = new AlertDialog.Builder(itemView.getContext());
    builder.setTitle("Choose Option");
    builder.setMessage("Update or Delete?");
    builder.setPositiveButton("Update", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {

            //go to update activity
            gotupdateuserActivity(user.getUserid());
            // dialog.cancel();

        }
    });
    builder.setNeutralButton("Delete", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            //go to Remove Item
            DatabaseHelper dbHelper = new DatabaseHelper(mContext);
            dbHelper.deletePersonRecord(user.getUserid(), mContext);
            listUsers.remove( position);
            notifyItemRemoved(position);
            mRecyclerView.removeViewAt(position);
            notifyItemRangeChanged(position, listUsers.size());
            notifyDataSetChanged();
            dialog.cancel();

        }
    });
    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
        }
    });
    AlertDialog alert11 = builder.create();
    alert11.show();
}
public void remove(int position) {
    listUsers.remove(position);
    notifyItemRemoved(position);
}

private void gotupdateuserActivity(String userid) {
    Intent goToUpdate = new Intent(mContext, UpdateUserRec.class);
    goToUpdate.putExtra("USER_ID", userid);
    Toast.makeText(mContext, "USER REC", Toast.LENGTH_SHORT).show();
    mContext.startActivity(goToUpdate);
}

这是 Sqlite 数据库助手类

public class DatabaseHelper extends SQLiteOpenHelper {

// Database Version
private static final int DATABASE_VERSION = 2;
Context context;

// Database Name
private static final String DATABASE_NAME = "DynamicERP.db";

public  static final String table_imei = "IMEITABLE";
public  static final String table_login= "USERLOGIN";

// User Table Columns names

public static final String imeiid = "IMEIID";
public static final String imei = "IMEI";

public static final String userid = "USERID";
public static final String username = "USERNAME";
public static final String password = "PASSWORD";
public static final String userrole = "USERROLE";


// create table sql query
private static final String DATABASE_CIMEI = "CREATE TABLE " + table_imei + "("
        + imeiid + " INTEGER, " + imei + " VARCHAR );" ;

private static final String DATABASE_CUSER = "CREATE TABLE " + table_login + "("
        + userid + " INTEGER, " + username + " VARCHAR, " + password + " INTEGER, " + userrole + " VARCHAR );" ;

// drop table sql query
private String DROP_IMEI_TABLE = "DROP TABLE IF EXISTS " + table_imei;
private String DROP_USER_TABLE = "DROP TABLE IF EXISTS " + table_login;

/**
 * Constructor
 *
 * @param context
 */
public DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(DATABASE_CIMEI);
    db.execSQL(DATABASE_CUSER);
}


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    //Drop User Table if exist
    db.execSQL(DROP_USER_TABLE);

    // Create tables again
    onCreate(db);

}

/**
 * This method is to create user record
 *
 * @param user
 */
public void addUser(User user) {
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(userid,user.getUserid());
    values.put(username, user.getName());
    values.put(password, user.getPassword());
    values.put(userrole, user.getRole());

    // Inserting Row
    db.insert(table_login, null, values);
    db.close();
}

public void addIMEI(User user) {
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(imei,user.getImei());
    values.put(imeiid, user.getImeiid());

    // Inserting Row
    db.insert(table_imei, null, values);
    db.close();
}

/**
 * This method is to fetch all user and return the list of user records
 *
 * @return list
 */
public List<User> getAllUser() {
    // array of columns to fetch
    String[] columns = {
            userid,
            username,
            password,
            userrole
    };
    // sorting orders
    String sortOrder =
            userid + " ASC";
    List<User> userList = new ArrayList<User>();

    SQLiteDatabase db = this.getReadableDatabase();

    // query the user table
    /**
     * Here query function is used to fetch records from user table this function works like we use sql query.
     * SQL query equivalent to this query function is
     * SELECT user_id,user_name,user_email,user_password FROM user ORDER BY user_name;
     */
    Cursor cursor = db.query(table_login, //Table to query
            columns,    //columns to return
            null,        //columns for the WHERE clause
            null,        //The values for the WHERE clause
            null,       //group the rows
            null,       //filter by row groups
            sortOrder); //The sort order


    // Traversing through all rows and adding to list
    if (cursor.moveToFirst()) {
        do {
            User user = new User();
            //user.setId(Integer.parseInt(cursor.getString(cursor.getColumnIndex(userid))));
            user.setUserid(cursor.getString(cursor.getColumnIndex(userid)));
            user.setName(cursor.getString(cursor.getColumnIndex(username)));
            user.setPassword(cursor.getString(cursor.getColumnIndex(password)));
            user.setRole(cursor.getString(cursor.getColumnIndex(userrole)));
            // Adding user record to list
            userList.add(user);
        } while (cursor.moveToNext());
    }
    cursor.close();
    db.close();

    // return user list
    return userList;
}



/**
 * This method is to fetch all user and return the list of user records
 *
 * @return list
 */
public List<User> getAllImei() {
    // array of columns to fetch
    String[] columns = {
            imeiid,
            imei,
    };
    // sorting orders
    String sortOrder =
            imeiid + " ASC";
    List<User> userList = new ArrayList<User>();

    SQLiteDatabase db = this.getReadableDatabase();

    // query the user table
    /**
     * Here query function is used to fetch records from user table this function works like we use sql query.
     * SQL query equivalent to this query function is
     * SELECT user_id,user_name,user_email,user_password FROM user ORDER BY user_name;
     */
    Cursor cursor = db.query(table_imei, //Table to query
            columns,    //columns to return
            null,        //columns for the WHERE clause
            null,        //The values for the WHERE clause
            null,       //group the rows
            null,       //filter by row groups
            sortOrder); //The sort order


    // Traversing through all rows and adding to list
    if (cursor.moveToFirst()) {
        do {
            User user = new User();
            //user.setId(Integer.parseInt(cursor.getString(cursor.getColumnIndex(userid))));
            user.setImei(cursor.getString(cursor.getColumnIndex(imei)));
            user.setImeiid(cursor.getString(cursor.getColumnIndex(imeiid)));
            // Adding user record to list
            userList.add(user);
        } while (cursor.moveToNext());
    }
    cursor.close();
    db.close();

    // return user list
    return userList;
}

/**
 * This method to update user record
 *
 * @param receivedUSERId
 * @param updateUserRec
 * @param user
 */
public void updateUser(String receivedUSERId, UpdateUserRec updateUserRec, User user) {
    SQLiteDatabase db = this.getWritableDatabase();
    String strSQL = "UPDATE "+table_login+ " SET "+username+" = "+user.getName()+"," +
            " "+password+" = "+user.getPassword()+","+userrole+" = "+user.getRole()+"" +
            " WHERE "+userid+" = "+receivedUSERId;
    db.execSQL(strSQL);
    db.close();
}



/**
 * This method is to delete user record
 *
 * @param user
 */
public void deleteUser(User user) {
    SQLiteDatabase db = this.getWritableDatabase();
    // delete user record by id
    db.delete(table_login, userid + " = ?",
            new String[]{String.valueOf(user.getUserid())});
    db.close();
}

/**
 * This method to check user exist or not
 *
  @param userid
 * @return true/false
 */
public boolean checkUser(String userid) {

    // array of columns to fetch
    String[] columns = {
            userid
    };
    SQLiteDatabase db = this.getReadableDatabase();

    // selection criteria
    String selection = userid + " = ?";

    // selection argument
    String[] selectionArgs = {userid};

    // query user table with condition
    /**
     * Here query function is used to fetch records from user table this function works like we use sql query.
     * SQL query equivalent to this query function is
     * SELECT user_id FROM user WHERE imei = 'dynamic@imei.com';
     */
    Cursor cursor = db.query(table_login, //Table to query
            columns,                    //columns to return
            selection,                  //columns for the WHERE clause
            selectionArgs,              //The values for the WHERE clause
            null,                       //group the rows
            null,                      //filter by row groups
            null);                      //The sort order
    int cursorCount = cursor.getCount();
    cursor.close();
    db.close();

    if (cursorCount > 0) {
        return true;
    }

    return false;
}


/**
 * This method to check user exist or not
 *
 * @param email
 * @param password
 * @return true/false
 */
public boolean checkUser(String email, String password) {

    // array of columns to fetch

    String[] columns = {
            userid
    };
    SQLiteDatabase db = this.getReadableDatabase();
    // selection criteria
    String selection = userid + " = ?" + " AND " + password + " = ?";

    // selection arguments
    String[] selectionArgs = {email, password};

    // query user table with conditions
    /**
     * Here query function is used to fetch records from user table this function works like we use sql query.
     * SQL query equivalent to this query function is
     * SELECT user_id FROM user WHERE user_email = 'jack@androidtutorialshub.com' AND user_password = 'qwerty';
     */
    Cursor cursor = db.query(table_login, //Table to query
            columns,                    //columns to return
            selection,                  //columns for the WHERE clause
            selectionArgs,              //The values for the WHERE clause
            null,                       //group the rows
            null,                       //filter by row groups
            null);                      //The sort order

    int cursorCount = cursor.getCount();

    cursor.close();
    db.close();
    if (cursorCount > 0) {
        return true;
    }

    return false;
}

/**
 * This method to check user exist or not
 *
 * @param userid
 * @param username
 * @return true/false
 */
public boolean checkUserData(String userid, String username) {

    // array of columns to fetch

    String[] columns = {
            userid
    };
    SQLiteDatabase db = this.getReadableDatabase();
    // selection criteria
    String selection = userid + " = ?" + " AND " + username + " = ?";

    // selection arguments
    String[] selectionArgs = {userid, username};

    // query user table with conditions
    /**
     * Here query function is used to fetch records from user table this function works like we use sql query.
     * SQL query equivalent to this query function is
     * SELECT user_id FROM user WHERE user_email = 'jack@androidtutorialshub.com' AND user_password = 'qwerty';
     */
    Cursor cursor = db.query(table_login, //Table to query
            columns,                    //columns to return
            selection,                  //columns for the WHERE clause
            selectionArgs,              //The values for the WHERE clause
            null,                       //group the rows
            null,                       //filter by row groups
            null);                      //The sort order

    int cursorCount = cursor.getCount();

    cursor.close();
    db.close();
    if (cursorCount > 0) {
        return true;
    }

    return false;
}

public boolean checkUserData(String userid) {
    // array of columns to fetch
    String[] columns = {
            userid
    };
    SQLiteDatabase db = this.getReadableDatabase();

    // selection criteria
    String selection = userid + " = ?";

    // selection argument
    String[] selectionArgs = {userid};

    // query user table with condition
    /**
     * Here query function is used to fetch records from user table this function works like we use sql query.
     * SQL query equivalent to this query function is
     * SELECT user_id FROM user WHERE user_email = 'dynamic@data.com';
     */
    Cursor cursor = db.query(table_login, //Table to query
            columns,                    //columns to return
            selection,                  //columns for the WHERE clause
            selectionArgs,              //The values for the WHERE clause
            null,                       //group the rows
            null,                      //filter by row groups
            null);                      //The sort order
    int cursorCount = cursor.getCount();
    cursor.close();
    db.close();

    if (cursorCount > 0) {
        return true;
    }

    return false;
}

public User getUser(String id){
    SQLiteDatabase db = this.getWritableDatabase();
    String query= "SELECT  * FROM "+table_login;

    Cursor cursor = db.rawQuery(query, null);

    User user = new User();
    if(cursor.getCount() > 0) {
        cursor.moveToFirst();

        user.setUserid(cursor.getString(cursor.getColumnIndex(userid)));
        user.setName(cursor.getString(cursor.getColumnIndex(username)));
        user.setPassword(cursor.getString(cursor.getColumnIndex(password)));
        user.setRole(cursor.getString(cursor.getColumnIndex(userrole)));
    }
    return user;

}

public void deletePersonRecord(String useridValue, Context mContext) {
    SQLiteDatabase db = this.getWritableDatabase();
    db.execSQL("DELETE FROM "+table_login+" WHERE "+userid +"='"+useridValue+"'");
    Toast.makeText(mContext, "Deleted successfully.", Toast.LENGTH_SHORT).show();
    db.close();
}
public void deleteIMEIRecord(String imeiidValue, Context mContext) {
    SQLiteDatabase db = this.getWritableDatabase();
    db.execSQL("DELETE FROM "+table_imei+" WHERE "+imeiid +"='"+imeiidValue+"'");
    Toast.makeText(mContext, "Deleted successfully.", Toast.LENGTH_SHORT).show();

}

public void updateIMEI(String receivedIMEIId, UpdateIMEIRec updateIMEIRec, User user) {
    SQLiteDatabase db = this.getWritableDatabase();
    String strSQL = "UPDATE "+table_imei+ " SET "+imei+" = "+user.getImei()+"," +
            " "+imeiid+" = "+user.getImeiid()+
            " WHERE "+imeiid+" = "+receivedIMEIId;
    db.execSQL(strSQL);
    db.close();

}



public User getIMEI(String receivedIMEIId) {
    SQLiteDatabase db = this.getWritableDatabase();
    String query = "SELECT  * FROM " + table_imei  ;
    Cursor cursor = db.rawQuery(query, null);

    User user = new User();
    if(cursor.getCount() > 0) {
        cursor.moveToFirst();

        user.setImeiid(cursor.getString(cursor.getColumnIndex(imeiid)));
        user.setImei(cursor.getString(cursor.getColumnIndex(imei)));
    }
    return user;
}

这是我的 Recycler List Activity 类

public class UserUpdateListActivity extends AppCompatActivity {

 AppCompatActivity activity = UserUpdateListActivity.this;

 AppCompatTextView textViewName;
 RecyclerView recyclerViewUsers;
 AppCompatButton textViewButtonNewUser;
 List<User> listUsers;
 UserRecyclerAdapterSavedUsers userRecyclerAdapterSavedUsers;

 DatabaseHelper databaseHelper;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_user_record_updated_list);
    //getSupportActionBar().setTitle("");
    initViews();
    initObjects();
}

@Override
public void onBackPressed() {
    super.onBackPressed();
    startActivity(new Intent(UserUpdateListActivity.this,AdminMain.class));
    finish();
}

@Override
protected void onRestart() {
    super.onRestart();
}


/**
 * This method is to initialize views
 */
private void initViews() {
    textViewName = (AppCompatTextView) findViewById(R.id.textViewName);
    textViewButtonNewUser = (AppCompatButton) findViewById(R.id.btnaddnew);
    recyclerViewUsers = (RecyclerView) findViewById(R.id.recyclerViewUsers);
    textViewButtonNewUser.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivity(new Intent(UserUpdateListActivity.this,UserRecordSaveActivity.class));
        }
    });
}

/**
 * This method is to initialize objects to be used
 */
private void initObjects() {
    listUsers = new ArrayList<>();
    userRecyclerAdapterSavedUsers = new UserRecyclerAdapterSavedUsers(listUsers,recyclerViewUsers);

    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
    recyclerViewUsers.setLayoutManager(mLayoutManager);
    recyclerViewUsers.setItemAnimator(new DefaultItemAnimator());
    recyclerViewUsers.setHasFixedSize(true);
    recyclerViewUsers.setAdapter(userRecyclerAdapterSavedUsers);
    databaseHelper = new DatabaseHelper(activity);

    String emailFromIntent = getIntent().getStringExtra("USERS");
    textViewName.setText(emailFromIntent);

    getDataFromSQLite();
}

/**
 * This method is to fetch all user records from SQLite
 */
private void getDataFromSQLite() {
    // AsyncTask is used that SQLite operation not blocks the UI Thread.
    new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... params) {
            listUsers.clear();
            listUsers.addAll(databaseHelper.getAllUser());

            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            userRecyclerAdapterSavedUsers.notifyDataSetChanged();
        }
    }.execute();
}

这是我用来删除数据的查询

    public void deletePersonRecord(String useridValue, Context mContext) {
    SQLiteDatabase db = this.getWritableDatabase();
    db.execSQL("DELETE FROM "+table_login+" WHERE "+userid +"='"+useridValue+"'");
    Toast.makeText(mContext, "Deleted successfully.", Toast.LENGTH_SHORT).show();
    db.close();
}

这是我的回收商列表的图片

List Items

当我点击一个项目时,它会打开一个像这样的对话框 Dialog

当我点击删除时,会显示这个 Clicking on Delete

在那之后当我按下并再次打开我删除的数据时再次打开 Logcat 没有错误

这是我的更新 Activity

public class UpdateUserRec extends AppCompatActivity {
EditText UserIDUpdate,UserNameUpdate,UserPasswordUpdate,UserRoleUpdate;
Button BtnUserRecUpdate;

DatabaseHelper dbHelper;
String receivedUSERId;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_update_record);
    UserIDUpdate= (EditText) findViewById(R.id.useridupdate);
    UserNameUpdate= (EditText) findViewById(R.id.usernameupdate);
    UserPasswordUpdate= (EditText) findViewById(R.id.userpasswordupdate);
    UserRoleUpdate= (EditText) findViewById(R.id.userroleupdate);
    BtnUserRecUpdate= (Button) findViewById(R.id.userbtnupdate);

    dbHelper = new DatabaseHelper(this);

    try {
        //get intent to get person id
        receivedUSERId= getIntent().getStringExtra("USER_ID");
    } catch (Exception e) {
        e.printStackTrace();
    }
    User user= dbHelper.getUser(receivedUSERId);

    UserIDUpdate.setText(user.getUserid());
    UserNameUpdate.setText(user.getName());
    UserPasswordUpdate.setText(user.getPassword());
    UserRoleUpdate.setText(user.getRole());

    BtnUserRecUpdate.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            updateUserFunction();
        }
    });
}

private void updateUserFunction() {
    String useridupdate = UserIDUpdate.getText().toString().trim();
    String usernameupdate = UserNameUpdate.getText().toString().trim();
    String userpasswordupdate = UserRoleUpdate.getText().toString().trim();
    String userroleupdate = UserRoleUpdate.getText().toString().trim();

    if(useridupdate.isEmpty()){
        //error name is empty
        Toast.makeText(this, "Enter User ID", Toast.LENGTH_LONG).show();
    }

    if(usernameupdate.isEmpty()){
        //error name is empty
        Toast.makeText(this, "Enter User Name", Toast.LENGTH_LONG).show();
    }

    if(userpasswordupdate.isEmpty()){
        //error name is empty
        Toast.makeText(this, "Enter the password", Toast.LENGTH_LONG).show();
    }

    if(userroleupdate.isEmpty()){
        //error name is empty
        Toast.makeText(this, "Enter User Role", Toast.LENGTH_LONG).show();
    }

    //create updated person
    User user = new User();

    //call dbhelper update
    dbHelper.updateUser(receivedUSERId, this, user);
    //finally redirect back home
    // NOTE you can implement an sqlite callback then redirect on success delete
    goBackHome();

}

private void goBackHome() {
    startActivity(new Intent(UpdateUserRec.this,UsersListActivity.class));
}

最佳答案

您正在从 RecyclerView 中显示数据的列表中删除数据。您应该记住数据库是您列表中的不同实体。数据库是数据的持久性存储,您从中删除项目的列表是非持久性存储。下次当您从数据库中获取数据时,列表将再次填充您之前删除的项目。

正确的方法是

  1. 从数据库中删除行
  2. 从适配器列表中删除项目
  3. notifyItemRemoved(位置)

你在SQ​​L类中有这个方法

public List<User> getAllUser() { ... }

再创建一个方法

public boolean deleteUser(id){ 
    db.delete(DATABASE_TABLE, KEY_NAME + "=" + id, null)
}

在删除项目时,使用特定的 Id 从您的适配器调用此方法,然后执行与之前相同的操作。

关于android - 从 Recycler 列表中删除但不从 Sqlite 数据库中删除的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54740698/

相关文章:

android - 使用我的 APK 实现 Proguard 安全

android - 替换 fragment 导致 RecyclerView$ViewHolder.shouldIgnore()’ 在空对象引用上

Android RecyclerView ItemTouchHelper 恢复滑动和恢复 View 持有者

java - Firebase Recycler 适配器不显示数据,但加载图像

android - 关于android :textAppearance的问题

android - 具有用户指定操作的隐式 Intent

python - 使用 Sqlite 在 pandas SQL API 上执行 REGEX 函数时出现导入错误 : Using URI string without sqlalchemy installed,

c# - DateTime.Now 是 future 使用的可靠方法吗?

java - 从主类调用 FragmentActivity (appCompatActivity)

sqlite - Firefox 扩展 SQLite 保存和获取