草庐IT

android - 拖放从 SQLiteDatabase 填充的 RecyclerView

coder 2023-07-20 原文

信息:

我有一个 RecyclerView,我用 ListAdapter 类中的 ArrayList dataList 填充它。我从 SQLiteDatabase 表中获取 dataList 的数据:DbHelper 类中的 TABLE_USERdETAIL。我正在尝试通过使用 SimpleItemTouchHelperCallback 类将拖放重新组织到 RecyclerView 中;然而,虽然我现在可以移动 RecyclerView 元素,但列表不会重新排序或移动;我只能暂时将列表元素相互拖动,如下图所示,但这意味着将列表元素永久地插入到它所在的任何位置:

我预计问题出在 ListAdapter 类中,在方法 onItemMove 中,但我不知道如何解决我的问题。

问题:如何让这个拖放功能真正重新组织 RecyclerView 数据列表?

更新 5:我已经更新了我当前的代码以获得进一步的帮助。

ListAdapter 类

public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ListViewHolder> {

    Context context;
    List<UserData> dataList = new ArrayList<>();
    LayoutInflater inflater;
    Listener listener;
    DbHelper dbHelper;



    public interface Listener {
        void nameToChnge(String name);
    }

    public ListAdapter(Context context, List<UserData> dataList1) {
        this.context = context;
        this.dataList = dataList1;
        //this.listener= (Listener) context;
        inflater = LayoutInflater.from(context);
    }


    @Override
    public ListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View convertView = inflater.inflate(R.layout.recylerview_one, parent, false);
        ListViewHolder viewHolder = new ListViewHolder(convertView);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ListViewHolder holder, final int position) {
        holder.tv_name.setText(dataList.get(position).name);
        holder.tv_quantity.setText(dataList.get(position).quantity);
        holder.tv_description.setText(dataList.get(position).description + " ");

        if(dataList.get(position).description.isEmpty()) {
            holder.tv_description.setVisibility(View.GONE);
        }

        holder.relLayout.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                String s = dataList.get(position).id;
                Integer stringo = Integer.parseInt(s);
                Intent intent = new Intent(context, ItemEditActivity.class);
                intent.putExtra("ItemNumber", stringo);
                context.startActivity(intent);
            }
        });
    }

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

    class ListViewHolder extends RecyclerView.ViewHolder implements ItemTouchHelperViewHolder {
        TextView tv_name, tv_quantity, tv_description;
        RelativeLayout relLayout;

        public ListViewHolder(View itemView) {
            super(itemView);
            tv_name = (TextView) itemView.findViewById(R.id.nameDisplay);
            tv_quantity = (TextView) itemView.findViewById(R.id.quantityDisplay);
            tv_description = (TextView) itemView.findViewById(R.id.descriptionDisplay);
            relLayout = (RelativeLayout) itemView.findViewById(R.id.relLayout);
        }
        @Override
        public void onItemSelected() {
            Log.d("ListViewHolder", "item selected");
        }

        @Override
        public void onItemClear() {
            Log.d("ListViewHolder", "item clear");
            for (int count = 0; count < dataList.size(); count++) {
                UserData u = dataList.get(count);
                u.setSort(count);
                dbHelper.updateUserData(u);
            }
            notifyDataSetChanged();
        }
    }

    public void onItemDismiss(int position) {
        dataList.remove(position);
        //dbHelper = DbHelper.getInstance(context);
        //dbHelper.deleteRowItem(position + 1);
        notifyItemRemoved(position);
    }

    //Collections.swap(dataList, fromPosition, toPosition);
    //notifyItemMoved(fromPosition, toPosition);


    public boolean onItemMove(int fromPosition, int toPosition) {
        if (fromPosition < toPosition) {
            for (int i = fromPosition; i < toPosition; i++) {
                Collections.swap(dataList, i, i + 1);
            }
        } else {
            for (int i = fromPosition; i > toPosition; i--) {
                Collections.swap(dataList, i, i - 1);
            }
        }
        notifyItemMoved(fromPosition, toPosition);
        return true;
    }
}

SimpleItemTouchHelperCallback 类

public class SimpleItemTouchHelperCallback extends ItemTouchHelper.Callback {
    private final ListAdapter  mAdapter;


    public SimpleItemTouchHelperCallback(ListAdapter adapter) {
        mAdapter = adapter;
    }

    @Override
    public boolean isLongPressDragEnabled() {return true; }

    @Override
    public boolean isItemViewSwipeEnabled() { return false; }

    @Override
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
        int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
        return makeMovementFlags(dragFlags, swipeFlags);
    }

    @Override
    public boolean onMove(RecyclerView recyclerView,
                          RecyclerView.ViewHolder viewHolder,
                          RecyclerView.ViewHolder target) {
        mAdapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
        return true;
    }

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
        mAdapter.onItemDismiss(viewHolder.getAdapterPosition());
    }

    @Override
    public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
        // We only want the active item to change
        if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
            if (viewHolder instanceof ItemTouchHelperViewHolder) {
                // Let the view holder know that this item is being moved or dragged
                Log.i("ADAPTER", "----DRAGGING----");
                ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;
                itemViewHolder.onItemSelected();
            }
        }

        super.onSelectedChanged(viewHolder, actionState);
    }
    @Override
    public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        super.clearView(recyclerView, viewHolder);

        if (viewHolder instanceof ItemTouchHelperViewHolder) {
            // Tell the view holder it's time to restore the idle state
            ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;
            itemViewHolder.onItemClear();
        }
    }
}

DbHelper 类

公共(public)类 DbHelper 扩展了 SQLiteOpenHelper {

   private static final String DATABASE_NAME = "UserDatabase";
    private static final int DATABASE_VERSION = 2;
    private static DbHelper mDbHelper;

    public static String TABLE_USERdETAIL = "userdetail";

    private static final String _ID = "_id";
    private static final String SORT_ID = "sort_id";
    private static final String NAME = "name";
    private static final String QUANTITY = "quantity";
    private static final String WEIGHT = "weight";
    private static final String WEIGHTTOTAL = "weighttotal";
    private static final String VALUE = "value";
    private static final String VALUETOTAL = "valuetotal";
    private static final String DESCRIPTION = "description";

    public static synchronized DbHelper getInstance(Context context) {
        if (mDbHelper == null) {
            mDbHelper = new DbHelper(context.getApplicationContext());
        }
        return mDbHelper;
    }

    public DbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }


    @Override
    public void onCreate(SQLiteDatabase db) {

        String CREATE_USERDETAIL_TABLE = "CREATE TABLE " + TABLE_USERdETAIL +
                "(" +
                _ID + " INTEGER PRIMARY KEY , " +
                SORT_ID + " INTEGER," +
                NAME + " TEXT," +
                QUANTITY + " INTEGER," +
                WEIGHT + " INTEGER," +
                WEIGHTTOTAL + " INTEGER," +
                VALUE + " INTEGER," +
                VALUETOTAL + " INTEGER," +
                DESCRIPTION + " TEXT" +
                ")";

        db.execSQL(CREATE_USERDETAIL_TABLE);
    }



    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (oldVersion != newVersion) {
            db.execSQL("ALTER TABLE " + TABLE_USERdETAIL + " ADD COLUMN " + WEIGHT + " INTEGER DEFAULT 0");
            db.execSQL("ALTER TABLE " + TABLE_USERdETAIL + " ADD COLUMN " + WEIGHTTOTAL + " INTEGER DEFAULT 0");
            db.execSQL("ALTER TABLE " + TABLE_USERdETAIL + " ADD COLUMN " + VALUE + " INTEGER DEFAULT 0");
            db.execSQL("ALTER TABLE " + TABLE_USERdETAIL + " ADD COLUMN " + VALUETOTAL + " INTEGER DEFAULT 0");
        }
    }

    /**
   Insert a  user detail into database
   */
    public void insertUserDetail(UserData userData) {

        SQLiteDatabase db = getWritableDatabase();

        db.beginTransaction();

        try {
            ContentValues values = new ContentValues();
            values.put(SORT_ID, userData.sort_id);
            values.put(NAME, userData.name);
            values.put(QUANTITY, userData.quantity);
            values.put(WEIGHT, userData.weight);
            values.put(WEIGHTTOTAL, userData.weighttotal);
            values.put(VALUE, userData.value);
            values.put(VALUETOTAL, userData.valuetotal);
            values.put(DESCRIPTION, userData.description);


            db.insertOrThrow(TABLE_USERdETAIL, null, values);
            db.setTransactionSuccessful();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            db.endTransaction();
        }


    }

    public void updateUserDetail(int id, String v1, String v2, String v3, String v4, String v5, String v6, String v7){
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(NAME, v1);
        values.put(QUANTITY, v2);
        values.put(DESCRIPTION, v3);
        values.put(WEIGHT, v4);
        values.put(WEIGHTTOTAL, v5);
        values.put(VALUE, v6);
        values.put(VALUETOTAL, v7);
        db.update(TABLE_USERdETAIL, values, "_id="+id, null);
    }

   /**
   fetch all data from UserTable
    */
    public List<UserData> getAllUser() {
        List<UserData> usersdetail = new ArrayList<>();

        String USER_DETAIL_SELECT_QUERY = "SELECT * FROM " + TABLE_USERdETAIL + " ORDER BY " + SORT_ID + " COLLATE NOCASE;";

        SQLiteDatabase db = getReadableDatabase();
        Cursor cursor = db.rawQuery(USER_DETAIL_SELECT_QUERY, null);

        try {
            if (cursor.moveToFirst()) {
                do {
                    UserData userData = new UserData();
                    userData.id = cursor.getString(cursor.getColumnIndex(_ID));
                    userData.sort_id = cursor.getInt(cursor.getColumnIndex(SORT_ID));
                    userData.name = cursor.getString(cursor.getColumnIndex(NAME));
                    userData.quantity = "Quantity: " + cursor.getString(cursor.getColumnIndex(QUANTITY));
                    userData.weight = cursor.getString(cursor.getColumnIndex(WEIGHT));
                    userData.weighttotal = cursor.getString(cursor.getColumnIndex(WEIGHTTOTAL));
                    userData.value = cursor.getString(cursor.getColumnIndex(VALUE));
                    userData.valuetotal = cursor.getString(cursor.getColumnIndex(VALUETOTAL));
                    userData.description = cursor.getString(cursor.getColumnIndex(DESCRIPTION));

                    usersdetail.add(userData);
                } while (cursor.moveToNext());
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (cursor != null && !cursor.isClosed()) {
                cursor.close();
            }
        }
        return usersdetail;

    }

    /**
   Delete single row from UserTable
     */
    void deleteRow(String name) {
        SQLiteDatabase db = getWritableDatabase();
        try {
            db.beginTransaction();
            db.execSQL("delete from " + TABLE_USERdETAIL + " where name ='" + name + "'");
            db.setTransactionSuccessful();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            db.endTransaction();
        }
    }

    void deleteRowItem(int id) {
        SQLiteDatabase db = getWritableDatabase();
        try {
            db.beginTransaction();
            db.execSQL("delete from " + TABLE_USERdETAIL + " where _id ='" + id + "'");
            db.setTransactionSuccessful();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            db.endTransaction();
        }
    }

    public UserData getSingleUserDetail(String userId) {
        SQLiteDatabase db = this.getWritableDatabase();
        UserData userData = null;

        //Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_USERdETAIL, null);

        // this is the code to order the RecyclerView by _ID:
        Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_USERdETAIL + " WHERE " + _ID + "= ?", new String[]{userId});
        try {
            while (cursor.moveToNext()) {
                userData = new UserData();
                userData.name = cursor.getString(cursor.getColumnIndex(NAME));
                userData.quantity = cursor.getString(cursor.getColumnIndex(QUANTITY));
                userData.weight = cursor.getString(cursor.getColumnIndex(WEIGHT));
                userData.weighttotal = cursor.getString(cursor.getColumnIndex(WEIGHTTOTAL));
                userData.value = cursor.getString(cursor.getColumnIndex(VALUE));
                userData.valuetotal = cursor.getString(cursor.getColumnIndex(VALUETOTAL));
                userData.description = cursor.getString(cursor.getColumnIndex(DESCRIPTION));
            }
            cursor.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (cursor != null && !cursor.isClosed()) {
                cursor.close();
            }
        }
        return userData;
    }

    public int getTotalWeight() {
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cur = db.rawQuery("SELECT SUM(WEIGHTTOTAL) FROM userdetail", null);
        if(cur.moveToFirst())
        {
            return cur.getInt(0);
        }
        cur.close();
        return getTotalWeight();
    }

    public int getTotalQuantity() {
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cur = db.rawQuery("SELECT SUM(QUANTITY) FROM userdetail", null);
        if(cur.moveToFirst())
        {
            return cur.getInt(0);
        }
        cur.close();
        return getTotalQuantity();
    }

    public int getTotalValue() {
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cur = db.rawQuery("SELECT SUM(VALUETOTAL) FROM userdetail", null);
        if(cur.moveToFirst())
        {
            return cur.getInt(0);
        }
        cur.close();
        return getTotalValue();
    }

    public int getMaxColumnData() {
        SQLiteDatabase db = this.getWritableDatabase();
        final SQLiteStatement stmt = db
                .compileStatement("SELECT MAX(SORT_ID) FROM " + TABLE_USERdETAIL);

        return (int) stmt.simpleQueryForLong();
    }

    public void updateUserData(UserData userData) {

        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();

        values.put(NAME, userData.getName());
        values.put(QUANTITY, userData.getQuantity());
        values.put(DESCRIPTION, userData.getDescription());
        values.put(WEIGHT, userData.getWeight());
        values.put(WEIGHTTOTAL, userData.getWeighttotal());
        values.put(VALUE, userData.getValue());
        values.put(VALUETOTAL, userData.getValuetotal());
        values.put(SORT_ID, userData.getSort());

        Log.i("DBhelper", "USER UPDATED = " + userData.getName());

        db.update(TABLE_USERdETAIL, values, _ID + "=?", new String[]{String.valueOf(userData.getId())});

    }
}

用户数据

import java.io.Serializable;

public class UserData implements Serializable {
    String id, name, quantity, weight, weighttotal, value, valuetotal, description;
    int sort_id;

    public UserData() {
        super();
    }

    public void setId(String id){
        this.id= id;
    }
    public String getId(){
        return id;
    }
    public void setSort(int sort){
        this.sort_id= sort;
    }
    public int getSort(){
        return sort_id;
    }

    public void setName(String name){
        this.name= name;
    }
    public String getName(){
        return name;
    }
    public void setDescription(String description){
        this.description= description;
    }
    public String getDescription(){
        return description;
    }
    public void setQuantity(String quantity){
        this.quantity= quantity;
    }
    public String getQuantity(){
        return quantity;
    }
    public void setWeight(String weight){
        this.weight= weight;
    }
    public String getWeight(){
        return weight;
    }
    public void setWeighttotal(String weighttotal){
        this.weighttotal= weighttotal;
    }
    public String getWeighttotal(){
        return weighttotal;
    }
    public void setValue(String value){
        this.value= value;
    }
    public String getValue(){
        return value;
    }
    public void setValuetotal(String valuetotal){
        this.quantity= valuetotal;
    }
    public String getValuetotal(){
        return quantity;
    }
}

ItemTouchHelperViewHolder 类

public interface ItemTouchHelperViewHolder {
    void onItemSelected();
    void onItemClear();
}

主要 Activity

public class MainActivity extends AppCompatActivity implements ListAdapter.Listener {


    RecyclerView recyclerView;
    DbHelper dbHelper;
    ListAdapter adapter;
    private ItemTouchHelper mItemTouchHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        dbHelper = DbHelper.getInstance(getApplicationContext());

        recyclerView = (RecyclerView) findViewById(R.id.rv_contactlist);
        adapter = new ListAdapter(this, dbHelper.getAllUser());
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        ItemTouchHelper.Callback callback =
                new SimpleItemTouchHelperCallback(adapter);
        mItemTouchHelper = new ItemTouchHelper(callback);
        mItemTouchHelper.attachToRecyclerView(recyclerView);

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main_menu, menu);
        return super.onCreateOptionsMenu(menu);


    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.about_task:
                Intent intentChangeActivity2 = new Intent(MainActivity.this, AboutActivity.class);
                startActivity(intentChangeActivity2);
                return true;
            case R.id.encumbrance_task:
                Intent intentChangeActivity = new Intent(MainActivity.this, EncumbranceActivity.class);
                startActivity(intentChangeActivity);
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        dbHelper = DbHelper.getInstance(getApplicationContext());

        recyclerView = (RecyclerView) findViewById(R.id.rv_contactlist);
        adapter = new ListAdapter(this, dbHelper.getAllUser());
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

    }

    @Override
    public void nameToChnge(String name) {
        dbHelper.deleteRow(name);

        adapter = new ListAdapter(this, dbHelper.getAllUser());
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
    }

错误日志:

8-26 11:20:49.443 23533-23533/name.appE/AndroidRuntime: FATAL EXCEPTION: main
                                                                       Process: name.app, PID: 23533
                                                                       java.lang.NullPointerException: Attempt to invoke virtual method 'void name.app.DbHelper.updateUserData(name.app.UserData)' on a null object reference
                                                                           at name.app.ListAdapter$ListViewHolder.onItemClear(ListAdapter.java:95)
                                                                           at name.app.SimpleItemTouchHelperCallback.clearView(SimpleItemTouchHelperCallback.java:63)
                                                                           at android.support.v7.widget.helper.ItemTouchHelper$3.onAnimationEnd(ItemTouchHelper.java:619)
                                                                           at android.support.v4.animation.HoneycombMr1AnimatorCompatProvider$AnimatorListenerCompatWrapper.onAnimationEnd(HoneycombMr1AnimatorCompatProvider.java:115)
                                                                           at android.animation.ValueAnimator.endAnimation(ValueAnimator.java:1149)
                                                                           at android.animation.ValueAnimator.doAnimationFrame(ValueAnimator.java:1309)
                                                                           at android.animation.AnimationHandler.doAnimationFrame(AnimationHandler.java:146)
                                                                           at android.animation.AnimationHandler.-wrap2(AnimationHandler.java)
                                                                           at android.animation.AnimationHandler$1.doFrame(AnimationHandler.java:54)
                                                                           at android.view.Choreographer$CallbackRecord.run(Choreographer.java:869)
                                                                           at android.view.Choreographer.doCallbacks(Choreographer.java:683)
                                                                           at android.view.Choreographer.doFrame(Choreographer.java:616)
                                                                           at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:857)
                                                                           at android.os.Handler.handleCallback(Handler.java:751)
                                                                           at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                           at android.os.Looper.loop(Looper.java:154)
                                                                           at android.app.ActivityThread.main(ActivityThread.java:6123)
                                                                           at java.lang.reflect.Method.invoke(Native Method)
                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)

最佳答案

我不确定是否捕获了你的问题,但我注意到了什么(希望这有帮助): 在您的 onItemMove 中,您正在通过交换项目重构 dataList,但适配器仅通知一般更改。

猜测移动项目(并保存动画)的最简单方法是将其删除并再次添加:

UserData item = dataList.remove(fromPosition);
dataList.add(i, toPossition);
notifyItemMoved(fromPosition, toPosition);

关于android - 拖放从 SQLiteDatabase 填充的 RecyclerView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41857823/

有关android - 拖放从 SQLiteDatabase 填充的 RecyclerView的更多相关文章

  1. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  2. ruby - 匹配大写字母并用后续字母填充,直到一定的字符串长度 - 2

    我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种

  3. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  4. ruby - 如何用递增的值填充数组 Ruby - 2

    我正在尝试解决http://projecteuler.net/problem=1.我想创建一个方法,它接受一个整数,然后创建一个包含它前面的所有整数的数组,并将整数本身作为数组中的值。以下是我目前所拥有的。代码不起作用。defmake_array(num)numbers=Array.newnumcount=1numbers.eachdo|number|numbers 最佳答案 (1..num).to_a是您在Ruby中需要做的全部。1..num将创建一个Range对象,以1开始并以任意值num结束是。Range对象有to_a方法通过

  5. ruby-on-rails - RoR中是否有任何内置方法可以为整数填充零? - 2

    如果我想要“00001”而不是“1”,除了我自己写填零方法之外,有没有内置的方法可以帮助我为整数填零? 最佳答案 puts"%05d"%1#00001参见:String::%,Kernel::sprintf这是正在发生的事情。%左侧的"%05d"是C风格的格式说明符。%右边的变量就是要格式化的东西。格式说明符可以像这样解码:%-格式说明符的开头0-用前导零填充5-长度为5个字符d-被格式化的是一个整数如果你要格式化多个东西,你会把它们放在一个数组中:"%d-%s"%[1,"One"]#=>1-one

  6. ruby-on-rails - 用一系列时间增量填充选择,加上其他选项 - 2

    使用RubyonRails,我使用给定的增量(例如每30分钟)用时间填充“选择”。目前我正在YAML文件中写出所有的可能性,但我觉得有一种更巧妙的方法。我想我想提供一个开始时间、一个结束时间、一个增量,并且目前只提供一个名为“关闭”的选项(想想“business_hours”)。所以,我的选择可能会显示:'Closed'5:00am5:30am6:00am...[allthewayto]...11:30pm谁能想出更好的方法,或者只是将它们全部“拼写”出来的最佳方法? 最佳答案 此答案基于@emh的答案。defcreate_hour

  7. ruby-on-rails - 将没有默认值的 NOT NULL 字段添加到填充的数据库中 - 2

    我有一个表,我们称它为MyTable。它是Postgresql数据库的一部分。MyTable中有很多条目,比方说超过一百万。我想向该表中添加一个字段,我们将其命名为MyNewField。它由ActiveRecord迁移添加。此字段没有默认值且不可为空。结果,在它的迁移类中将是这样的:classAddMyFieldToMyTable但是,它会触发一个错误(PG::NotNullViolation),因为该表已经包含行,所有这些行的MyField都设置为NULL。我想做的是:添加没有默认值且可空设置为false的行(不触发PG::NotNullViolation)。然后,将另一个表中的值插

  8. ruby-on-rails - 如何按照散列中的数字序列生成和填充缺失数据 - 2

    我正在尝试创建一个函数来完成以下哈希中的小时序列。{name:"cardio",data:[["06:00",999],["09:00",154],["10:00",1059],["11:00",90]]}它应该在字段数据中创建所有缺失值["07:00",0],["08:00",0],["12:00",0],["13:00",0]...["23:00",0]预期结果:{name:"cardio",data:[["06:00",999],["07:00",0],["08:00",0],["09:00",154],["10:00",1059],["11:00",90]],["12:00",

  9. ruby-on-rails - 如何为特色对象预填充表单? - 2

    用户可以输入自定义:action或选择特色:action:Orchooseafeaturedchallenge:如果用户选择特色:action,新的挑战/_form会预先填充他选择的:action,但现在我想把它带到在您的帮助下更上一层楼!Challenge:DoOn:DoFor:如何预填充特色挑战的其他属性,例如“DoFor”或“DoOn”?例如,如果用户选择特色:action:'RunaMile那么我会用RunaMile预填充表单>,周一、周三、周五,30天。 最佳答案 您可以将simple_form与reform一起使用。Re

  10. ruby-on-rails - Rails 4 — 如何从 JSON API 填充用户模型? - 2

    首先,我是Rails的新手,如果有任何我不理解的地方,请见谅。我想知道如何通过API获取数据来填充模型。上下文:我正在使用带有omniauth/devise的OAuth2身份验证。在我的用户Controller客户端(与提供者相对)中,我获取了所有至少登录一次的用户就是这个“客户端应用程序”,我想显示它们。显然,每当新用户登录到客户端应用程序时,我不会将他的所有信息存储在客户端数据库中以避免重复。我存储的只是user_id及其访问token。因此,我想在获取所有用户数据后,我可以将它们填充到用户模型,然后再将其传递给View。做这样的事情最好的方法是什么?我正在研究命名范围,但我不清楚

随机推荐