Помогите Java & SQLite

Korvinius

Активный участник
Пользователь
Баллы
88
Пришло время, когда мне понадобилась база данных. В моем случае, самый оптимальный вариант, это SQLite. Долго гуглил, ковырялся в чужих плагинах, но, что то у меня обучение работы с БД почти не продвигается, поэтому прошу совета у Вас, подскажите где можно об этом почитать, на русском, украинском или белорусском языках.
Я вот навырезал с чужих плагинов кусков:
Java:
    public static Connection conn = null;
    public static ResultSet rset = null;

    public static void connect() {
        try {
            Class.forName("org.sqlite.JDBC").newInstance();
            conn = DriverManager.getConnection("jdbc:sqlite://" + Mystery.instance.getDataFolder().getAbsolutePath() + "/Mystery.db");
        } catch (InstantiationException | IllegalAccessException | ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
        executeSync("CREATE TABLE IF NOT EXISTS `three_legacy` (`id` INTEGER PRIMARY KEY, "
                + "`legacy` TEXT varchar(255) NOT NULL UNIQUE, "
                + "`lord_uniqueId` TEXT varchar(255) NOT NULL UNIQUE, "
                + "`legacyLevel` INTEGER NOT NULL");
    }

    public static void executeSync(String query) {
        if(!hasConnected()) {
            connect();
        }
        try {
            conn.createStatement().execute(strip(query));
        } catch (Exception e) {
        }
    }

    public static boolean hasConnected() {
        try {
            return !conn.isClosed();
        } catch (Exception e) {
            return false;
        }
    }

    public static String strip(String str) {
        str = str.replaceAll("<[^>]*>", "");
        str = str.replace("\\", "\\\\");
        str = str.trim();
        return str;
    }

    public static ResultSet executeQuery(String query) {
        if(!hasConnected()) {
            connect();
        }
        ResultSet res = null;
        try {
            res = conn.createStatement().executeQuery(strip(query));
        } catch (Exception e) {
        }

        return res;
    }
насколько я смог понять, метод connect() нужен для подключения к БД, чтения данных или создания таблиц, если она пуста, остальные методы как бы воспомогательные, или есть среди них ненужные? Что мне сюда нужно еще добавить, для полноценной работы с БД, то есть, записи, перезаписи, сохранения и так далее? Или это, что я наваял вообще никуда не годится? Короче прошу советов и ссылок на обучающие материалы 🙂
 
, еще в дополнение, если у меня кое какие задачи выполняются по таймеру, ну то есть "шедулеры", они выполняются в каком потоке? (сори за нубские вопросы🫢)
Шедулер (Scheduler) — блок, выполняющий менеджмент задач (можно писать, например, тасков (Task)) для их выполнения по заданному расписанию.
Все они (запускаемые через методы runTask*, schedule*Task и т.п.) планируются на определённые ближайшие серверные тики и, естественно, выполняются в основном потоке. В параллельном потоке будут запущены только те, которые ты стартанул через методы со словом Async*. Но это всё лишняя обёртка, поэтому для старта задачи в параллели достаточно сделать свою new Thread(...), а из неё планировать таски в основной цикл через runTask.
 
Это бд в файле, который нужно периодически сохранять/загружать. Некоторые драйверы из-за таймаута просто выгружают бд из памяти, из-за чего нужно бд снова прочитать и загрузить. Возможно, это неверное суждение, поскольку оно у меня работало более менее шустро (от 0 до 16 ms).
Нужно держать соединение с SQLite открытым, как и с MySQL, тогда все операции осуществляются быстро.
 
Нужно держать соединение с SQLite открытым, как и с MySQL, тогда все операции осуществляются быстро.
Если на сервере 0 игроков в течение 12 часов, тоже оставлять открытой?
 
Шедулер (Scheduler) — блок, выполняющий менеджмент задач (можно писать, например, тасков (Task)) для их выполнения по заданному расписанию.
Все они (запускаемые через методы runTask*, schedule*Task и т.п.) планируются на определённые ближайшие серверные тики и, естественно, выполняются в основном потоке. В параллельном потоке будут запущены только те, которые ты стартанул через методы со словом Async*. Но это всё лишняя обёртка, поэтому для старта задачи в параллели достаточно сделать свою new Thread(...), а из неё планировать таски в основной цикл через runTask.
хз правильно это или нет, сделал так, чтобы после запуска сервера, через "х" минут запускался второй поток,в котором бесконечный цыкл просыпается каждые 10 минут, обрабатывает имеющиеся данные и записывает их в БД, а так как есть 2 плановые перезагрузки сервера в 8.00 и 17.00, чтобы работа с базой не попала на время перезагрузки, сделал ее на 1 минуту раньше, то есть в 9, 19, 29, 39, 49, 59 минут каждого часа:
Java:
    @Override
    public void onEnable() {




        BukkitScheduler scheduler = Bukkit.getServer().getScheduler();
        scheduler.scheduleSyncDelayedTask(this, new Runnable() {
            @Override
            public void run() {
                new TimeLevelRun(Mystery.instance);
                instance.getLogger().info("Обновление рангов запущено!");
            }
        }, getMinToHourNull()*1200);
    }

    public int getMinToHourNull() {
        int i = 0;
        Date d = new Date();
        SimpleDateFormat min = new SimpleDateFormat("mm");
        try {
            i = Integer.parseInt(min.format(d).toString());
        } catch (NumberFormatException e) { 
        }

        i = 60-(i+1);
        if (i>50)         return i-50;
        if (i<50 && i>40) return i-40;
        if (i<40 && i>30) return i-30;
        if (i<30 && i>20) return i-20;
        if (i<20 && i>10) return i-10;
        if (i<10 && i>5) return i-5;
        return i;
    }



public class TimeLevelRun implements Runnable {

    private Mystery plugin;
    private Thread thread;

    public TimeLevelRun(Mystery plg) {
        this.plugin = plg;
        thread = new Thread(this, "Calculate time-level Players: ");
        thread.start();
    }

    @Override
    public void run() {
        LevelCalculate calc = new LevelCalculate();
       
        while(true) {

            calc.setTimesLevels(plugin);
            plugin.getLogger().info("Ранги обновлены!");

            try {
                Thread.sleep(600000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }
}
 
Если на сервере 0 игроков в течение 12 часов, тоже оставлять открытой?
Это же просто файл, нет ничего плохого в том, что программа, работающая часами, держит файл, с которым она может обмениваться информацией, открытым.
сделал так, чтобы после запуска сервера, через "х" минут запускался второй поток,в котором бесконечный цыкл просыпается каждые 10 минут, обрабатывает имеющиеся данные и записывает их в БД, а так как есть 2 плановые перезагрузки сервера в 8.00 и 17.00, чтобы работа с базой не попала на время перезагрузки, сделал ее на 1 минуту раньше, то есть в 9, 19, 29, 39, 49, 59 минут каждого часа
Можно ведь блокировать onDisable до тех пор, пока все данные не запишутся в БД. Даже если это параллельный поток, просто стоишь на ожидании его завершения и всё. Поэтому вся кухня с минутами костыль, имхо.

Из альтернатив: пусть параллельный поток всегда пишет в БД, как только появляются новые данные. Тогда БД будет всегда почти сразу в актуальном состоянии. Сочетается с предыдущим абзацем.
 
Если на сервере 0 игроков в течение 12 часов, тоже оставлять открытой?
Разумеется. База локальная, как в случае с MySQL трафик не будет регулярно ходить туда-сюда, чтобы соединение не пало по таймауту.
Держи всегда открытым, это нормально.
 
Это же просто файл, нет ничего плохого в том, что программа, работающая часами, держит файл, с которым она может обмениваться информацией, открытым.
Разумеется. База локальная, как в случае с MySQL трафик не будет регулярно ходить туда-сюда, чтобы соединение не пало по таймауту.
Держи всегда открытым, это нормально.
Возможно я имел в виду что используются ресурсы для этого, что немного фу. Хотя, я уже не помню, что хотел сказать этим :с
 
Возможно я имел в виду что используются ресурсы для этого, что немного фу. Хотя, я уже не помню, что хотел сказать этим :с
21 век же, не надо быть мелочным. SQLite база данных - это не просто файл, это база данных. Там все продумано и все содержимое не хранится в памяти сервера.
 
Поэтому вся кухня с минутами костыль, имхо.
ну, изначально, я этот "костыль" лепил, для того, чтобы все нужные работы проводились по фиксированному времени, то есть не в 17.03 или 14.04, а 17.00, 14.00, 14.10 и т.д., чтобы знать точное время пересчета, но потом просто решил еще и отминусовать 1 минуту, дабы не пересекалось с рестартами...
 
Ну, если работает и нет причин переписывать как-то лучше, конечно, ОКъ.
 
Ну, если работает и нет причин переписывать как-то лучше, конечно, ОКъ.
я не говорю что нет причин делать лучше) просто объяснил зачем этот костыль делал, а для улучшения кода и причин искать не нужно...
 
Пришло время, когда мне понадобилась база данных. В моем случае, самый оптимальный вариант, это SQLite. Долго гуглил, ковырялся в чужих плагинах, но, что то у меня обучение работы с БД почти не продвигается, поэтому прошу совета у Вас, подскажите где можно об этом почитать, на русском, украинском или белорусском языках.
Я вот навырезал с чужих плагинов кусков:

насколько я смог понять, метод connect() нужен для подключения к БД, чтения данных или создания таблиц, если она пуста, остальные методы как бы воспомогательные, или есть среди них ненужные? Что мне сюда нужно еще добавить, для полноценной работы с БД, то есть, записи, перезаписи, сохранения и так далее? Или это, что я наваял вообще никуда не годится? Короче прошу советов и ссылок на обучающие материалы 🙂
Вай сколько костылей велосипедов. PreparedStatement не не слышали, от sql inj?
Ты сломал мои глаза...

  1. i = 60-(i+1);
  2. if (i>50) return i-50;
  3. if (i<50 && i>40) return i-40;
  4. if (i<40 && i>30) return i-30;
  5. if (i<30 && i>20) return i-20;
  6. if (i<20 && i>10) return i-10;
  7. if (i<10 && i>5) return i-5;
  8. return i;
  9. К чему такая лесенка?
 
Вай сколько костылей велосипедов. PreparedStatement не не слышали, от sql inj?
Ты сломал мои глаза...

  1. i = 60-(i+1);
  2. if (i>50) return i-50;
  3. if (i<50 && i>40) return i-40;
  4. if (i<40 && i>30) return i-30;
  5. if (i<30 && i>20) return i-20;
  6. if (i<20 && i>10) return i-10;
  7. if (i<10 && i>5) return i-5;
  8. return i;
  9. К чему такая лесенка?
хз, я же не профи, а любитель 🙂 как сумел, так и придумал, есть вариант лучше? Я всегда благодарен за советы...
 
Нужно держать соединение с SQLite открытым, как и с MySQL, тогда все операции осуществляются быстро.
Насколько я знаю - это считается плохим тоном, поэтому закрываю соединение после каждой операции.
 
Насколько я знаю - это считается плохим тоном, поэтому закрываю соединение после каждой операции.
Создаём пул из 2-3 соединений и уже можно закрывать со спокойной душой, пул сам откроет соединение, если понадобится.
 
Создаём пул из 2-3 соединений и уже можно закрывать со спокойной душой, пул сам откроет соединение, если понадобится.
На SQLite нет смысла закрывать, там же не общая база для овер900 плагинов и тп.
 
Здравствуйте, решил я обновить свой плагин с версии 1.8.8 до 1.12.2 подключил SpigotAPI 1.12.2 и в результате, с ранее работающего плагина получаю такой вот результат:
Код:
java.sql.SQLException: Values not bound to statement
<------>at org.sqlite.core.CorePreparedStatement.checkParameters(CorePreparedStatement.java:64) ~[middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at org.sqlite.jdbc3.JDBC3PreparedStatement.executeQuery(JDBC3PreparedStatement.java:73) ~[middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at net.wealth_mc.mystery.db.Database.initialize(Database.java:41) [Mystery.jar:?]
<------>at net.wealth_mc.mystery.db.SQLite.load(SQLite.java:98) [Mystery.jar:?]
<------>at net.wealth_mc.mystery.Mystery.onEnable(Mystery.java:88) [Mystery.jar:?]
<------>at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:264) [middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:337) [middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:403) [middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at org.bukkit.craftbukkit.v1_12_R1.CraftServer.enablePlugin(CraftServer.java:382) [middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at org.bukkit.craftbukkit.v1_12_R1.CraftServer.enablePlugins(CraftServer.java:331) [middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at net.minecraft.server.v1_12_R1.MinecraftServer.t(MinecraftServer.java:422) [middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at net.minecraft.server.v1_12_R1.MinecraftServer.l(MinecraftServer.java:383) [middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at net.minecraft.server.v1_12_R1.MinecraftServer.a(MinecraftServer.java:338) [middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at net.minecraft.server.v1_12_R1.DedicatedServer.init(DedicatedServer.java:272) [middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:545) [middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at java.lang.Thread.run(Thread.java:748) [?:1.8.0_151]

Код:
package net.wealth_mc.mystery.db;

import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;

import net.wealth_mc.mystery.Mystery;

public class SQLite extends Database{

    private String dbname;

    public SQLite(Mystery instance){
        super(instance);
        dbname =  "Mystery";
    }
            
    public Connection getSQLConnection() {
        File dataFolder = new File(plugin.getDataFolder(), dbname+".db");
        if (!dataFolder.exists()){
            try {
                dataFolder.createNewFile();
            } catch (IOException e) {
                plugin.getLogger().log(Level.SEVERE, "File write error: "+dbname+".db");
            }
        }
        try {
            if(connection!=null && !connection.isClosed()){
                return connection;
            }
            Class.forName("org.sqlite.JDBC");
            connection = DriverManager.getConnection("jdbc:sqlite:" + dataFolder);
            return connection;
        } catch (SQLException ex) {
            plugin.getLogger().log(Level.SEVERE,"SQLite exception on initialize", ex);
        } catch (ClassNotFoundException ex) {
            plugin.getLogger().log(Level.SEVERE, "You need the SQLite JBDC library. Google it. Put it in /lib folder.");
        }
        return null;
    }
 
    public void load() {
        connection = getSQLConnection();     
        try {
            Statement s = connection.createStatement();
            s.executeUpdate("CREATE TABLE IF NOT EXISTS mystery_player_list ("
/* 1*/                + "`uniqueId` TEXT varchar(255) NOT NULL UNIQUE, "
/* 2*/                + "`displayName` TEXT varchar(100) NOT NULL UNIQUE, "
/* 3*/                + "`legacy` TEXT varchar(50) NOT NULL DEFAULT 'VAGUE', "
/* 4*/                + "`legacy_info` TEXT varchar(255), "
/* 5*/                + "`legacy1` TEXT varchar(50) NOT NULL DEFAULT 'VAGUE', "
/* 6*/                + "`legacy_info1` TEXT varchar(255), "
/* 7*/                + "`legacy2` TEXT varchar(50) NOT NULL DEFAULT 'VAGUE', "
/* 8*/                + "`legacy_info2` TEXT varchar(255), "
/* 9*/                + "`legacy3` TEXT varchar(50) NOT NULL DEFAULT 'VAGUE', "
/*10*/                + "`legacy_info3` TEXT varchar(255), "
/*11*/                + "`legacy4` TEXT varchar(50) NOT NULL DEFAULT 'VAGUE', "
/*12*/                + "`legacy_info4` TEXT varchar(255), "
/*13*/                + "`gender` TEXT varchar(50) NOT NULL DEFAULT 'ASEX', "
/*14*/                + "`level` INTEGER, "
/*15*/                + "`timeLevel` INTEGER, "
/*16*/                + "`gamehours` INTEGER, "
/*17*/                + "`killLevel` INTEGER, "
/*18*/                + "`killTheirLegacy` INTEGER, "
/*19*/                + "`killAlienLegacy` INTEGER, "
/*20*/                + "`killNotLegacy` INTEGER, "
/*21*/                + "`IPadress` TEXT varchar(15) NOT NULL, "
/*22*/                + "`nomult` INTEGER, "
/*23*/                + "`register` INTEGER, "
/*24*/                + "`online` INTEGER,"
/*25*/                + "`grp` TEXT,"
/*26*/                + "`family` TEXT varchar(100),"
/*27*/                + "`bal0` TEXT,"
/*28*/                + "`bal1` TEXT,"
/*39*/                + "`bal2` TEXT,"
/*30*/                + "`bal3` TEXT,"
/*31*/                + "`bal4` TEXT,"
/*32*/                + "`bal5` TEXT,"
/*33*/                + "`bal6` TEXT,"
/*34*/                + "`bal7` TEXT,"
/*35*/                + "`bal8` TEXT, PRIMARY KEY (`uniqueId`));");
            s.executeUpdate("CREATE TABLE IF NOT EXISTS three_legacy ("
/* 1*/                + "`legacy` TEXT varchar(255) NOT NULL UNIQUE,"
/* 2*/                + "`lord_uniqueId` TEXT varchar(255) NOT NULL UNIQUE,"
/* 3*/                + "`legacyLevel` INTEGER,"
/* 4*/                + "`legacyInteger` INTEGER,"
/* 5*/                + "`legacyInfo`, PRIMARY KEY (`legacy`));");

            s.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        initialize(); // ***************Это строка № 98*************
    }

}

Код:
package net.wealth_mc.mystery.db;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import java.util.logging.Level;
import java.util.regex.Pattern;

import net.wealth_mc.mystery.Mystery;
import net.wealth_mc.mystery.family.HomeLoc;

public abstract class Database {

    protected Mystery plugin;
    protected Connection connection;
    public String three_legacy;
    public String mystery_player_list;

    public Database(Mystery instance){
        this.plugin = instance;
        this.three_legacy = "three_legacy";
        this.mystery_player_list = "mystery_player_list";
    }

    public abstract Connection getSQLConnection();

    public abstract void load();

    /**
     * Инициализация БД
     */
    public void initialize(){
        connection = getSQLConnection();
        try{
            PreparedStatement ps = connection.prepareStatement("SELECT * FROM " + mystery_player_list + " WHERE uniqueId = ?");
            ResultSet rs = ps.executeQuery(); //**********Это строка № 41************
            close(ps,rs);
        
        } catch (SQLException ex) {                                                                                                                                                                                                                                                                                                                                                                     
            plugin.getLogger().log(Level.SEVERE, "Unable to retreive connection", ex);
        }
    }

    /**
     * Закрыть подключение к БД
     * @param ps
     * @param rs
     */
    public void close(PreparedStatement ps,ResultSet rs){
        try {
            if (ps != null)
                ps.close();
            if (rs != null)
                rs.close();
        } catch (SQLException ex) {
            Error.close(plugin, ex);
        }
    }
    /**
     * Получить double из String
     * @param bal
     * @return
     */
    public double getBalToStrins(String bal) {
        double balance = Double.parseDouble(bal);
        return balance;
    }
    /**
     * Получить List<UUID> из String
     * @param str
     * @return
     */
    public List<UUID> stringKindToList(String str) {
        List<UUID> uulist = new ArrayList<>();
        String newstr = str.replace("[", "").replace("]", "");
        List<String> list = new ArrayList<String>(Arrays.asList(newstr.split(", ")));
        for (int i = 0; i < list.size(); i++) {
            uulist.add(UUID.fromString(list.get(i)));
        }
        return uulist;
    }

    /**
     *
     * @param get HomeLoc to String
     * @return
     */

    public HomeLoc getHomeLoc(String str) {
        Pattern pattern = Pattern.compile(" ");
        String[] locitem = pattern.split(str);
        HomeLoc loc = new HomeLoc(
                Mystery.getInstance().getServer().getWorld(locitem[1]),
                getIntToString(locitem[2]),
                getIntToString(locitem[3]),
                getIntToString(locitem[4]));
        return loc;
    }


    /**
     *
     * @param get int to String
     * @return
     */
    private int getIntToString(String str) {
        int i = 0;
        
        try {
            i = Integer.parseInt(str);
        } catch (NumberFormatException e) {
        }
        
        return i;
    }
}

Не подскажете где мне что нужно копать?
 
Здравствуйте, решил я обновить свой плагин с версии 1.8.8 до 1.12.2 подключил SpigotAPI 1.12.2 и в результате, с ранее работающего плагина получаю такой вот результат:
Код:
java.sql.SQLException: Values not bound to statement
<------>at org.sqlite.core.CorePreparedStatement.checkParameters(CorePreparedStatement.java:64) ~[middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at org.sqlite.jdbc3.JDBC3PreparedStatement.executeQuery(JDBC3PreparedStatement.java:73) ~[middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at net.wealth_mc.mystery.db.Database.initialize(Database.java:41) [Mystery.jar:?]
<------>at net.wealth_mc.mystery.db.SQLite.load(SQLite.java:98) [Mystery.jar:?]
<------>at net.wealth_mc.mystery.Mystery.onEnable(Mystery.java:88) [Mystery.jar:?]
<------>at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:264) [middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:337) [middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:403) [middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at org.bukkit.craftbukkit.v1_12_R1.CraftServer.enablePlugin(CraftServer.java:382) [middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at org.bukkit.craftbukkit.v1_12_R1.CraftServer.enablePlugins(CraftServer.java:331) [middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at net.minecraft.server.v1_12_R1.MinecraftServer.t(MinecraftServer.java:422) [middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at net.minecraft.server.v1_12_R1.MinecraftServer.l(MinecraftServer.java:383) [middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at net.minecraft.server.v1_12_R1.MinecraftServer.a(MinecraftServer.java:338) [middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at net.minecraft.server.v1_12_R1.DedicatedServer.init(DedicatedServer.java:272) [middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:545) [middle112.jar:git-Spigot-549c1fa-45c8386]
<------>at java.lang.Thread.run(Thread.java:748) [?:1.8.0_151]

Код:
package net.wealth_mc.mystery.db;

import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;

import net.wealth_mc.mystery.Mystery;

public class SQLite extends Database{

    private String dbname;

    public SQLite(Mystery instance){
        super(instance);
        dbname =  "Mystery";
    }
           
    public Connection getSQLConnection() {
        File dataFolder = new File(plugin.getDataFolder(), dbname+".db");
        if (!dataFolder.exists()){
            try {
                dataFolder.createNewFile();
            } catch (IOException e) {
                plugin.getLogger().log(Level.SEVERE, "File write error: "+dbname+".db");
            }
        }
        try {
            if(connection!=null && !connection.isClosed()){
                return connection;
            }
            Class.forName("org.sqlite.JDBC");
            connection = DriverManager.getConnection("jdbc:sqlite:" + dataFolder);
            return connection;
        } catch (SQLException ex) {
            plugin.getLogger().log(Level.SEVERE,"SQLite exception on initialize", ex);
        } catch (ClassNotFoundException ex) {
            plugin.getLogger().log(Level.SEVERE, "You need the SQLite JBDC library. Google it. Put it in /lib folder.");
        }
        return null;
    }
 
    public void load() {
        connection = getSQLConnection();    
        try {
            Statement s = connection.createStatement();
            s.executeUpdate("CREATE TABLE IF NOT EXISTS mystery_player_list ("
/* 1*/                + "`uniqueId` TEXT varchar(255) NOT NULL UNIQUE, "
/* 2*/                + "`displayName` TEXT varchar(100) NOT NULL UNIQUE, "
/* 3*/                + "`legacy` TEXT varchar(50) NOT NULL DEFAULT 'VAGUE', "
/* 4*/                + "`legacy_info` TEXT varchar(255), "
/* 5*/                + "`legacy1` TEXT varchar(50) NOT NULL DEFAULT 'VAGUE', "
/* 6*/                + "`legacy_info1` TEXT varchar(255), "
/* 7*/                + "`legacy2` TEXT varchar(50) NOT NULL DEFAULT 'VAGUE', "
/* 8*/                + "`legacy_info2` TEXT varchar(255), "
/* 9*/                + "`legacy3` TEXT varchar(50) NOT NULL DEFAULT 'VAGUE', "
/*10*/                + "`legacy_info3` TEXT varchar(255), "
/*11*/                + "`legacy4` TEXT varchar(50) NOT NULL DEFAULT 'VAGUE', "
/*12*/                + "`legacy_info4` TEXT varchar(255), "
/*13*/                + "`gender` TEXT varchar(50) NOT NULL DEFAULT 'ASEX', "
/*14*/                + "`level` INTEGER, "
/*15*/                + "`timeLevel` INTEGER, "
/*16*/                + "`gamehours` INTEGER, "
/*17*/                + "`killLevel` INTEGER, "
/*18*/                + "`killTheirLegacy` INTEGER, "
/*19*/                + "`killAlienLegacy` INTEGER, "
/*20*/                + "`killNotLegacy` INTEGER, "
/*21*/                + "`IPadress` TEXT varchar(15) NOT NULL, "
/*22*/                + "`nomult` INTEGER, "
/*23*/                + "`register` INTEGER, "
/*24*/                + "`online` INTEGER,"
/*25*/                + "`grp` TEXT,"
/*26*/                + "`family` TEXT varchar(100),"
/*27*/                + "`bal0` TEXT,"
/*28*/                + "`bal1` TEXT,"
/*39*/                + "`bal2` TEXT,"
/*30*/                + "`bal3` TEXT,"
/*31*/                + "`bal4` TEXT,"
/*32*/                + "`bal5` TEXT,"
/*33*/                + "`bal6` TEXT,"
/*34*/                + "`bal7` TEXT,"
/*35*/                + "`bal8` TEXT, PRIMARY KEY (`uniqueId`));");
            s.executeUpdate("CREATE TABLE IF NOT EXISTS three_legacy ("
/* 1*/                + "`legacy` TEXT varchar(255) NOT NULL UNIQUE,"
/* 2*/                + "`lord_uniqueId` TEXT varchar(255) NOT NULL UNIQUE,"
/* 3*/                + "`legacyLevel` INTEGER,"
/* 4*/                + "`legacyInteger` INTEGER,"
/* 5*/                + "`legacyInfo`, PRIMARY KEY (`legacy`));");

            s.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        initialize(); // ***************Это строка № 98*************
    }

}

Код:
package net.wealth_mc.mystery.db;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import java.util.logging.Level;
import java.util.regex.Pattern;

import net.wealth_mc.mystery.Mystery;
import net.wealth_mc.mystery.family.HomeLoc;

public abstract class Database {

    protected Mystery plugin;
    protected Connection connection;
    public String three_legacy;
    public String mystery_player_list;

    public Database(Mystery instance){
        this.plugin = instance;
        this.three_legacy = "three_legacy";
        this.mystery_player_list = "mystery_player_list";
    }

    public abstract Connection getSQLConnection();

    public abstract void load();

    /**
     * Инициализация БД
     */
    public void initialize(){
        connection = getSQLConnection();
        try{
            PreparedStatement ps = connection.prepareStatement("SELECT * FROM " + mystery_player_list + " WHERE uniqueId = ?");
            ResultSet rs = ps.executeQuery(); //**********Это строка № 41************
            close(ps,rs);
       
        } catch (SQLException ex) {                                                                                                                                                                                                                                                                                                                                                                    
            plugin.getLogger().log(Level.SEVERE, "Unable to retreive connection", ex);
        }
    }

    /**
     * Закрыть подключение к БД
     * @param ps
     * @param rs
     */
    public void close(PreparedStatement ps,ResultSet rs){
        try {
            if (ps != null)
                ps.close();
            if (rs != null)
                rs.close();
        } catch (SQLException ex) {
            Error.close(plugin, ex);
        }
    }
    /**
     * Получить double из String
     * @param bal
     * @return
     */
    public double getBalToStrins(String bal) {
        double balance = Double.parseDouble(bal);
        return balance;
    }
    /**
     * Получить List<UUID> из String
     * @param str
     * @return
     */
    public List<UUID> stringKindToList(String str) {
        List<UUID> uulist = new ArrayList<>();
        String newstr = str.replace("[", "").replace("]", "");
        List<String> list = new ArrayList<String>(Arrays.asList(newstr.split(", ")));
        for (int i = 0; i < list.size(); i++) {
            uulist.add(UUID.fromString(list.get(i)));
        }
        return uulist;
    }

    /**
     *
     * @param get HomeLoc to String
     * @return
     */

    public HomeLoc getHomeLoc(String str) {
        Pattern pattern = Pattern.compile(" ");
        String[] locitem = pattern.split(str);
        HomeLoc loc = new HomeLoc(
                Mystery.getInstance().getServer().getWorld(locitem[1]),
                getIntToString(locitem[2]),
                getIntToString(locitem[3]),
                getIntToString(locitem[4]));
        return loc;
    }


    /**
     *
     * @param get int to String
     * @return
     */
    private int getIntToString(String str) {
        int i = 0;
       
        try {
            i = Integer.parseInt(str);
        } catch (NumberFormatException e) {
        }
       
        return i;
    }
}

Не подскажете где мне что нужно копать?
 
Назад
Верх