Как хранить 60 целых чисел в классе для записи / чтения из базы данных? - PullRequest
1 голос
/ 19 июня 2019

Я настраиваю приложение, чтобы отслеживать результаты стрельбы из лука.Каждый выстрел состоит из 60 стрелок от 0 до 10.Каков наилучший способ настроить класс для хранения каждой оценки стрелок, чтобы затем записывать их в базу данных SQLite?

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

public class Portsmouth {

    private int id;
    Date date;
    private int arrow1;
    private int arrow2;
    private int arrow3;
    ...
    private int arrow60;

}

Ответы [ 5 ]

3 голосов
/ 19 июня 2019

Просто используйте массив целых чисел, как это:

import java.lang.System; //imported by default

public class Portsmouth {

    private int id;
    Date date;
    private int[] arrow; 

    public Portsmouth(int id, Date data, int[] arr){
      this.id = id;
      this.date = date;
      arrow = new int[60];

      System.arraycopy(arr, 0, arrow, 0, 60);

      /**for(int i=0;i<60;i++){
         arrow[i] = arr[i];
      }**/
    }

}
2 голосов
/ 19 июня 2019

Используйте массив int[] или List<Integer> вместо определения полей один за другим.

SQL, который вы запускаете для вставки строк в базу данных, зависит от вашей схемы, например, таблица нормализуется с 60 столбцами против 60 строк, по одному для каждой стрелки. Обычно модель домена отделяется от схемы с помощью шаблона, подобного DAO .

0 голосов
/ 19 июня 2019

Если вы планируете выдвигать / извлекать всю информацию в базу данных, одним из способов перемещения этих данных будет использование Java Persistence API (JPA). Таким образом, вы можете выдвигать или извлекать данные без труда. Одним из ограничений JPA является то, что каждый столбец в строке должен иметь свою собственную переменную , поэтому, как вы сказали, у вас будет много строк. Обратите внимание, что JPA требует какой-то ключ базы данных.

К счастью, если вы хотите увеличить объем данных, это будет так просто:

Class.forName("your.database.driver");
Connection con = DriverManager.getConnection("url", "username", "password");

EntityManagerFactory emf = Persistence.createEntityManagerFactory("PersistenceUnitName");
EntityManager em = emf.createEntityManager();

PersistenceEntity persistenceEntity; //This is what holds all of your data

em.persist(persistenceEntity); //Push a full row of data
em.getTransaction.commit(); 
con.close();

Вы также можете использовать несколько довольно умных способов , чтобы отображать / получать доступ к этой информации, когда она не используется напрямую с базой данных, чтобы не вызывать что-то вроде Java Reflection API,

0 голосов
/ 19 июня 2019

Но почему вы назвали свой класс Портсмут?Лучше сделать все более удобным для использования.Может быть, три класса (3 таблицы базы данных).

Class Tournament{
    private int id;
    Date date;
    String name;
    String place
    Shoot shoot;
}

Class Shoot {
     private int id;
     @OneToMany     
     List<Arrow> arrowList;
}

Class Arrow {
     private int id;
     @ManyToOne
     private Shoot shoot;
     private Integer orderNumber; (1-60)  
     private Integer result (1-10)  instead of Integer can be modified to ENUM ArrowResult from 1-10
}
0 голосов
/ 19 июня 2019

Я предлагаю класс Arrow, у которого будет ваш счет за эту стрелку 1-10. Затем ILIST со стрелкой в ​​другом классе под названием Shoot. Тогда я представлю, что у вас есть еще один турнир и / или класс стрелка, для которого вы включаете свойства в класс Shoot. Попробуйте, если вам это нравится, и я могу расширить.

...