Android studio отображение данных из локальной базы данных sqlite

#java #sqlite #android-studio

#java #sqlite #android-studio

Вопрос:

Кажется, я не могу найти какие-либо решения этой проблемы в Интернете. в основном я работаю над приложением, которое позволяет пользователю создавать тренировки и просматривать их, и я борюсь с частью просмотра.

Вся моя база данных настроена с помощью пользовательского ввода с использованием полей exercise , sets и reps, пользователь создает тренировку, а содержимое таблицы, используемой для ее построения, копируется в новую, и таблица очищается для ввода новых данных.

Я хочу создать представление переработчика, используя имена таблиц, передать выбранное имя элемента следующему фрагменту и использовать выбор пользователей, чтобы определить, какие данные будут показаны в следующем представлении переработчика.

Возможно ли это, и если да, пожалуйста, покажите мне, как, я должен подготовить это приложение через пару дней для задания

любая помощь будет оценена, спасибо — Ян

Ответ №1:

Для clairfy вы хотели бы составить список из списка? Используйте отношение «один ко многим» или сопоставьте с помощью room. Я сделал такую реализацию несколько дней назад, не стесняйтесь спрашивать.

https://developer.android.com/training/data-storage/room/relationships?fbclid=IwAR3P_rK8OeOpBpP9jgbL8FqxEKPXPvOaFwFiCMy4pIpblg_aF_9QloavHpM

https://developer.android.com/training/data-storage/room/relationships?fbclid=IwAR22XINRNxTs3b_KOleeYwjGuIwjUA90S3tvpMWkf1dKYjvDDo5qWAbLfoE

Чтобы получить предыдущий идентификатор или имя, просто используйте простой набор позиций (или идентификаторов) определенного элемента из первого recyclerview и используйте его во втором для отображения правильных данных.

Ответ №2:

Возможно ли это, и если да, пожалуйста, покажите мне, как.

Это возможно.

Вот рабочая демонстрация, которая показывает, как это сделать.

Сначала класс, который расширяет SQLiteOpenHelper, как обычно используется, а именно DatabaseHelper в этом примере:-

 class DatabaseHelper extends SQLiteOpenHelper {

    public static final String DATABASE_NAME = "thedatabase.db";
    public static final int DATABASE_VERSION = 1;

    private SQLiteDatabase db;

    private DatabaseHelper(Context context) {
        super(context,DATABASE_NAME,null,DATABASE_VERSION);
        db = this.getWritableDatabase();
    }

    private static volatile DatabaseHelper instance = null;
    public static DatabaseHelper getInstance(Context context) {
        if (instance == null) {
            instance = new DatabaseHelper(context);
        }
        return instance;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(MyTable.CREATE_SQL);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int old_version, int new_version) {

    }

    public long insertMyTableRow(Long id, String item_name) {
        ContentValues cv = new ContentValues();
        cv.put(MyTable.COL_ITEM_NAME,item_name);
        if (id != null amp;amp; id == 0) {
            cv.put(MyTable.COl_ID,id);
        }
        return db.insertWithOnConflict(MyTable.TABLE_NAME,null,cv,SQLiteDatabase.CONFLICT_IGNORE);
    }

    @SuppressLint("Range")
    public MyTable[] getAllMyTableRowAsArrayOfMyTable() {
        MyTable[] rv = new MyTable[0];
        Cursor csr = db.query(MyTable.TABLE_NAME,null,null,null,null,null,null);
        if (csr.getCount() > 0) {
            rv = new MyTable[csr.getCount()];
        }
        int idx = 0;
        while (csr.moveToNext()) {
            rv[idx  ] = new MyTable(
                    csr.getLong(csr.getColumnIndex(MyTable.COl_ID)),
                    csr.getString(csr.getColumnIndex(MyTable.COL_ITEM_NAME)
                    )
            );
        }
        csr.close();
        return rv;
    }

    @SuppressLint("Range")
    public MyTable getAMyTableById(long id) {
        MyTable rv = new MyTable(-1,"NOT FOUND");
        Cursor csr = db.query(MyTable.TABLE_NAME,null,MyTable.COl_ID "=?",new String[]{String.valueOf(id)},null,null,null);
        if (csr.moveToFirst()) {
            rv = new MyTable(csr.getLong(csr.getColumnIndex(MyTable.COl_ID)),csr.getString(csr.getColumnIndex(MyTable.COL_ITEM_NAME)));
        }
        csr.close();
        return rv;
    }  
}

class MyTable {
    public static final String TABLE_NAME = (MyTable.class.getSimpleName()).toLowerCase();
    public static final String COl_ID = TABLE_NAME   BaseColumns._ID;
    public static final String COL_ITEM_NAME = TABLE_NAME   "_item_name";
    // and so on
    public static final String CREATE_SQL = "CREATE TABLE IF NOT EXISTS "   TABLE_NAME  
            "("
              COl_ID   " INTEGER PRIMARY KEY"
              ","   COL_ITEM_NAME   " TEXT UNIQUE "
            // and so on
              ")";
    long id;
    String itemName;
    MyTable(long id, String item_name) {
        this.id = id;
        this.itemName = item_name;
    }
}
 

Действию, которое будет называться MainActivity2, передается уникальный идентификатор элемента, на который нажат, с помощью дополнительного намерения :-

 public class MainActivity2 extends AppCompatActivity {

    public static final String INTENT_EXTRA_MYTABLE_ID = "ie_mytable_id";
    DatabaseHelper dbHelper;
    TextView itemName;
    Button done;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        itemName = this.findViewById(R.id.item_name);
        done = this.findViewById(R.id.done);
        dbHelper = DatabaseHelper.getInstance(this);
        itemName.setText((dbHelper.getAMyTableById(this.getIntent().getLongExtra(INTENT_EXTRA_MYTABLE_ID,-99))).itemName);
        done.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });
    }
}
 

Адаптер TheAdapter и т. Д. Для RecyclerView, включая прослушиватели щелчков по элементам и длинных щелчков по элементам. Нажатие на элемент поджаривает детали. Длительное нажатие запускает второе действие, которое отображает выбранный элемент:-

 public class TheAdapter extends RecyclerView.Adapter<TheAdapter.ViewHolder> {

    private MyTable[] localData;
    public static class ViewHolder extends RecyclerView.ViewHolder {

        private final TextView textView1;
        private final TextView textView2;
        public ViewHolder(View view) {
            super(view);
            textView1 = (TextView) view.findViewById(android.R.id.text1);
            textView2 = (TextView) view.findViewById(android.R.id.text2);
        }

        public TextView getTextView1() {
            return textView1;
        }
        public TextView getTextView2() {
            return textView2;
        }
    }

    public TheAdapter(MyTable[] thedata) {
        localData = thedata;
    }

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

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.getTextView1().setText(String.valueOf(localData[position].id));
        holder.getTextView2().setText(localData[position].itemName);
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(
                        view.getContext(),
                        "You clicked the Item named "
                                  localData[holder.getAdapterPosition()].itemName
                                  " the ID is "   String.valueOf(localData[holder.getAdapterPosition()].id),
                        Toast.LENGTH_SHORT
                ).show();
            }
        });
        holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                Intent intent = new Intent(view.getContext(),MainActivity2.class);
                intent.putExtra(MainActivity2.INTENT_EXTRA_MYTABLE_ID,localData[holder.getAdapterPosition()].id);
                view.getContext().startActivity(intent);
                return true;
            }
        });
    }

    @Override
    public int getItemCount() {
        return localData.length;
    }
}
 

Наконец, первое / начальное действие MainActivity :-

 public class MainActivity extends AppCompatActivity {

    DatabaseHelper dbHelper;
    RecyclerView myTableList;
    TheAdapter adapter;
    MyTable[] theDataToBeDisplayed;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myTableList = this.findViewById(R.id.mytable_list);
        dbHelper = DatabaseHelper.getInstance(this);
        addSomeTestingData();
        setupOrRefreshMyTableList();
    }

    private void setupOrRefreshMyTableList() {
        theDataToBeDisplayed = dbHelper.getAllMyTableRowAsArrayOfMyTable();
        if (adapter == null) {
            adapter = new TheAdapter(theDataToBeDisplayed);
            myTableList.setAdapter(adapter);
            myTableList.setLayoutManager(
                    new LinearLayoutManager(this)
            );
        } else {
            /* handle changed data here */
        }
    }

    private void addSomeTestingData() {
        for (int i=0; i < 100; i  ) {
            dbHelper.insertMyTableRow(null, "A"   String.valueOf(i));
        }
    }
}
 

При запуске:-

введите описание изображения здесь

При длительном нажатии на элемент (например, A10 (идентификатор которого равен 11)) :-

введите описание изображения здесь

Нажатие ГОТОВО возвращает к первому действию.

Комментарии:

1. Большое спасибо! Это полностью отвечает на мой вопрос, надеюсь, я смогу пройти сейчас, ха-ха

2. @IanSmith если вы считаете, что ответ был хорошим / полезным / лучшим из доступных ответов, пожалуйста, отметьте ответ, чтобы указать, что он помог.