Jackcess получить отсортированную таблицу или самый большой индекс в ней

Я хочу вставить строку в таблицу jackcess, которая создается следующим образом;

Table t = Database.open(new File(dbUrl)).getTable(tname);

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

В любом случае, после получения таблицы я пытаюсь вставить в нее строку, используя;

        int id = t.getRowCount() + 1;

        try {
            t.addRow(id, "MyName", "MyLastName");
        } catch (IOException ex) {
            ex.printStackTrace();
        }

Но поскольку индекс не отсортирован, я получаю следующее исключение:

java.io.IOException: New row [250, MyName, MyLastName, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] violates uniqueness constraint for index 
Data number: 5
Page number: 99
Is Backing Primary Key: true
Is Unique: true
Ignore Nulls: false
Columns: [ColumnDescriptor  Name: (CLIENTES) ID_CLIENTE
Type: 0x4 (LONG)
Number: 0
Length: 4
Variable length: false flags: 1]
Initialized: true
EntryCount: 249
    Cache: 
    LeafDataPage[99] 0, 0, (0), [RowId = 93:0, Bytes = 7F 80 00 00  00 , RowId = 6844:0, Bytes = 7F 80 00 01  5C]

at com.healthmarketscience.jackcess.IndexData.addEntry(IndexData.java:571)
at com.healthmarketscience.jackcess.IndexData.addRow(IndexData.java:537)
...

Теперь я подумал, что, возможно, это не удалось из-за отсутствия других столбцов, но затем я попытался использовать t.getRowCount() + 100; и смог вставить. Итак, моя проблема явно в том, что я понятия не имею, как получить индекс или отсортированную таблицу.

Очевидно, что подсчет строк — паршивое решение. Я только что попробовал это в любом случае.


person Alejandro Alcaide    schedule 24.01.2013    source источник


Ответы (1)


Чтобы получить строки в отсортированном порядке, вы можете выполнить итерацию по курсору, который был подкреплен индексом. Следующий код, используя метод, описанный в ответе здесь, просматривает таблицу в порядке первичного ключа и извлекает самый большой ключ. ценность. Затем он добавляет новую строку со следующим наибольшим значением ключа.

import java.io.File;
import java.io.IOException;
import com.healthmarketscience.jackcess.*;

public class jackcessTest {

    public static void main(String[] args) {
        try {
            Table table = DatabaseBuilder.open(new File("C:\\Users\\Public\\Database1.accdb")).getTable("JackcessTest");
            int LargestKey = 0;
            // the following loop is modified from 
            //     https://stackoverflow.com/a/19304549/2144390
            //     for Jackcess 2.0
            for(Row row : CursorBuilder.createCursor(table.getPrimaryKeyIndex())) {
                LargestKey = (int)row.get("ID");
            }
            try {
                table.addRow(LargestKey + 1, "MyName", "MyLastName");
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("Done.");        
    }
}
person Gord Thompson    schedule 19.10.2013