• Как закрыть соединение с БД SQLite?

    logpol32
    @logpol32 Автор вопроса
    Василий Банников,

    string sqlCommandText = "SELECT * FROM table1 WHERE field1='test'  LIMIT 1";
    SqliteDataReader sqliteDataReader = SQLiteData.GetSqliteDataReader(pathToBase, sqlCommandText); // Получили из класса выше.
    i++; arrayOfIntParameters[i] = Convert.ToInt32(sqliteDataReader["id"]);
    s++; arrayOfStringParameters[s] = sqliteDataReader["text1"].ToString();


    Пояснения этой каши.
    1) В программе мне надо многократно обращаться к БД. Я не хочу дублировать код - открытия и настройки соединения. Поэтому я вынес это в класс GetSqliteDataReader.

    2) Я возвращаю SqliteDataReader т.к. этот объект содержит всю выборку из БД.
    Обычно идет цикл while (sqliteDataReader.Read()) в котором идет выборка данных.
    Но у меня отдельный метод, а значит мне нужно не просто выбрать данные, но вернуть их из метода.
    С учетом того, что данные в БД разного типа - int, string - у меня нет единого объекта для их хранения или такой объект будет сложным (в PHP это был (и есть) бы массив - он там динамический и не типизированный). Так зачем что то придумывать, если уже есть SqliteDataReader?

    i++; arrayOfIntParameters[i] = Convert.ToInt32(sqliteDataReader["id"]);
    Это стоит переписать. Кроме i++ я так и не разобрался как автоматически конвертировать данные sqliteDataReader в string или int (там должен быть свой метод).
  • Как закрыть соединение с БД SQLite?

    logpol32
    @logpol32 Автор вопроса
    Василий Банников

    Вычитай данные из SqliteDataReader и проблем с закрытием не будет.

    Не понял. Вычитать данные - это как?

    задиспозить

    Вот так пойдет?

    // Класс  - осуществляющий соединение с БД.
    public class GetSqliteDataReaderInstance : IDisposable
    {
    SqliteDataReader sqliteDataReader;
    public SqliteDataReader _sqliteDataReader{ get{return sqliteDataReader;} set{sqliteDataReader=value;} }
    
    public GetSqliteDataReaderInstance(string pathToBase, string sqlCommandText)
    {
    SqliteConnection connection = new SqliteConnection("Data Source="+pathToBase);
    connection.Open();
    SqliteCommand sqliteCommand = new SqliteCommand();
    sqliteCommand.Connection = connection;
    sqliteCommand.CommandText = sqlCommandText;
    SqliteDataReader sqliteDataReader = sqliteCommand.ExecuteReader();
    this.sqliteDataReader = sqliteDataReader;
    }
    
    
    // Хз как это работает и что должно быть внутри, но интерфейс IDisposable обязывает меня реализовать метод.
    void IDisposable.Dispose()
    {
    GC.SuppressFinalize(this);
    }
    }
    
    
    
    // Статический класс - обертка.
    public static class SQLiteData
    {
    public static SqliteDataReader GetSqliteDataReader(string pathToBase, string sqlCommandText)
    {
    // Директива using должна гарантировано и безопасно уничтожить экземпляр класса, а вместе с ним и подключение к юазе т.к. оно в нем.
    using(GetSqliteDataReaderInstance getSqliteDataReaderInstance = new GetSqliteDataReaderInstance(pathToBase, sqlCommandText))
    {
    return getSqliteDataReaderInstance._sqliteDataReader;
    }
    }
    }
  • Как изменить свойство объекта?

    logpol32
    @logpol32 Автор вопроса
    А с фреймворками работали?

    .NET, YII2, React на базовом уровне.
    Пока не соглашусь - к Юнити много вопросов. Если уж взяли себе C# будьте добры реализовать его идеологию.

    Создал класс.
    Пытаюсь создать экземпляр класса.
    Player player = new Player ();
    Ошибка. В юнити так нельзя. И объяснение на стаке что класс MonoBehaviours особенный, что там к чему привязано и тд. Но это же база ООП.

    Аналогично
    [SerializaField] private int myvar;
    То есть модификатор доступа прайват (не лезь сюда!) а тут мало того что добавили ещё один, свой SerializaField, так ещё и открыли извне. Да доступ из движка, но нарушена архитектура приложения.

    В итоге вроде знаешь C#, знаешь ООП, но юнити работает по другому.

    Реально попроходите туториалы какие то

    Много обучающих роликов на ютубе. Но уровень, с точки зрения C# очень низкий.
    Вот, например, Роман Сакутин - GameDev. Позиционирует свою студию как профессиональную, критикует Гошу Дударя.

    Простите, но человек который предлагает называть в C# поле с нижнего подчеркивания или большой буквы..ну ему об этом и намекают, посылая на mdsn.
    Там конечно "научишься".
    Нет, задачу ты решишь, но потом придется переучиваться.
    Курсов достойных мало. В основном как сделать платформер, как сделать кнопку и т.д.
  • Как изменить свойство объекта?

    logpol32
    @logpol32 Автор вопроса
    Вот так работает.
    GameObject questionText = GameObject.Find("QuestionText");  
    Text mytext = questionText.GetComponent<Text>();
    mytext.text="Мой текст";

    Логика и синтаксис конечно да....

    Компонент это по сути же дочерний элемент объекта. Это буквально его свойство, то что наделяет объект свойствами массы, размера и т.д.
    В чем проблема было сделать как у всех Имя объекта.Его свойство?
  • Как изменить свойство объекта?

    logpol32
    @logpol32 Автор вопроса
    Все явно там указано - Find возвращает GameObject:

    увидел, да это есть.
    MyText - в вашем скрине - это не класс. Это имя объекта сцены вообще.

    Я это понимаю.

    Вам надо разобраться с сущностями

    То есть? Там есть что то особенное - принципы, идеи, подходы, чего нет в C#, Delphi, PHP, HTML, Javascript, CSS? Я работал со всеми этими языками.
    Вот это GameObject.Find это практически getElementById() из JS.

    Ладно, читаем маны
    https://docs.unity3d.com/560/Documentation/Manual/...
    Объект - сущность, представляющая контейнер для компонентов.
    Грубо говоря есть объект игрок на которого мы вешаем имейдж - спрайт, коллайдеры, указываем массц или что там ещё у него должно быть. Формируем игрока из компонентов.

    Компоненты
    https://docs.unity3d.com/560/Documentation/Manual/...
    Функциональные части объекта.

    Монобех
    https://docs.unity3d.com/ScriptReference/MonoBehav...
    MonoBehaviour
    Базовый класс, от которого наследуются все скрипты.

    Вопрос тот же - почему я не могу обратиться к объекту, вызвать у него компонент и установить у этого компонента свойство?

    Так тоже не работает.
    От класса унаследовался, пространство имен подключил.
    Пишу
    GameObject questionText = GameObject.Find("QuestionText");  
    questionText.Text.text="Мой текст";

    Не работает.

    Получил референс на объект.
    Получил компонент объекта (по логике c# через точку как метод или поле).
    Имя Text - имя компонента невозможно изменить, других вариантов нет.
    Обратился к свойству компонента text и присвоил ему значение.
  • Как изменить свойство объекта?

    logpol32
    @logpol32 Автор вопроса
    GavriKos,
    Класс объекта не тот.

    Как я могу узнать класс объекта? Где он написан?
    Смотрите Delphi (Аналогично и в других языках\IDE).
    63232dff6daaa878199923.jpeg
    Unity
    63232ef748c55387075371.jpeg

    Нет ошибки, если закомментировать.
    GameObject myText = GameObject.Find("MyText");
    //myText.text="Сцена загружена!";

    То есть я делаю апкаст Text к GameObject и конечно у GameObject не может быть свойства Text (что очевидно)?

    Хорошо, напишу так
    Text  questionText = GameObject.Find("QuestionText"); // Без
      // varquestionText = GameObject.Find("QuestionText"); // Или так
       questionText.text="Сцена загружена!";

    Ошибка.

    GameObject.Find - тип возвращаемого значения?
    https://docs.unity3d.com/ScriptReference/GameObjec...
    Finds a GameObject by name and returns it.
    Находит GameObject по имени и возвращает его.
    Тип? GameObject? Явно не указано (обычно в мануале явно указывают тип ).
    Неизвестен. (Visual Studio 2019 (IntelliSense) не работает с юнити)

    ---------В MDSN от майкрософт всё понятно--------
    public static string[] GetFiles (string path);
    Returns
    String[]
    An array of the full names (including paths) for the files in the specified directory, or an empty array if no files are found.
    Нет вопросов.
    ---------------

    И мануал вы смотрите не к GameObject, а к Text.

    https://docs.unity3d.com/ru/2018.4/ScriptReference/UI.Text.html
  • Как изменить свойство объекта?

    logpol32
    @logpol32 Автор вопроса
    Не понял.
    У любого объекта, будь он визуальный или нет есть свойства, методы и события.
    QT, Delphi, Visual C#.
    Берем label тянем его на Form в коде пишем Form.label.text='Новый текст';
    Что тут не так?
  • Под какие разрешения экранов делать игру?

    logpol32
    @logpol32 Автор вопроса
    Николай Савельев, DPI - это про четкость. Часто используется в типографике. Тут вопрос про размер.
    Представьте, что вы отошли от экрана на 5 метров.
    Если это 24 дюймовый экран - вы будете видеть элементы игры, например кнопку.
    Если это 5 дюймовый экран - вы не будете видеть элементы игры. И всё равно насколько там четкая кнопка, сколько точек для её отрисовки. Просто маленький экран.

    Я не представляю, как люди что то смотрят на своих смартфонах под такое (1280x2400) разрешение.
    В вебе отдельно проектируют сайты под смартфоны, потому что неприятно нормально смотреть десктопную версию сайта на смартфоне. Проверял лично.

    maksam07,
    Можно же даже банально посмотреть разрешение своего телефона
    можно, но этих телефонов и разрешений полно.

    как у смартфона может быть разрешение 1280x2400

    может быть любое. Я на своем 24 дюймовый экране могу поставить 640x480. Будет ли удобно? Нет.
  • Как исправит ошибку sqlite near 1 syntax error?

    logpol32
    @logpol32 Автор вопроса
    freeExec, ничего там не нашел.
    Стал делать поле id primary key - ошибка исчезла.
  • Поясните по структуре HTML документа (теги, расположение, синтаксис)?

    logpol32
    @logpol32 Автор вопроса
    3)
    Браузер загружает HTML постепенно и, если он видит тег script, то он должен выполнить его и только после этого загружать контент, находящийся после.

    И тут возникает ещё один вопрос:

    Пусть в js скрипте есть обращение к div с id="myElement", например показать его (или что угодно).
    И в html есть div с id="myElement".
    Имеет ли значение порядок расположения скрипта и div в html документе?
    Например, скрипт ниже, чем div или наоборот. Скрипт всегда найдет этот div?
    А в случае $( document ).ready(function() - ?
  • Как лучше организовать замену текста в строке?

    logpol32
    @logpol32 Автор вопроса
    entermix, да, по условию задачи эти позиции заранее известны. (Там своя логика)
    Мы знаем сам текст, позицию начала и позицию окончания.
    Кстати, замена всегда одна (параметр $replace['limit'] всегда 1).

    Пока проблема в том, что может быть 2 одинаковых текста.
    $str = 'Текст, ещё текст ABCDEF ABCDEF';
    И всё бы получилось, если бы мы могли не просто заменить текст, а заменить его начиная с символа начала (он нам известен).
    Замена всегда одна, так что нам не надо даже знать окончание текста.

    Если символ начала текста 22 (первый текст ABCDEF), то он будет заменен, а второй текст останется прежним т.к. мы делаем ровно 1 замену.

    Если символ начала текста 31 (второй текст ABCDEF), то он будет заменен, а первый текст останется прежним т.к. мы делаем замену с символа 31 (первый текст не попадет - останется левее).

    Как то так...

    PS
    Что означают # по бокам? Зачем их присоединяют к искомому тексту?
    '#' . $replace['text'] . '#'
  • Как лучше организовать замену текста в строке?

    logpol32
    @logpol32 Автор вопроса
    ThunderCat ,
    В соответствующие позиции перед и после нужного слова добавляем символы, например |

    Логично, но, я писал про
    важна позиция текста

    Именно позиция гарантирует, что будет заменен нужный текст. Не его содержание.

    Чисто теоретически в строке может быть текст с этим же символом. Ничто не мешает ему там быть, хотя вероятность этого ничтожно мала.

    $myString='Текст, ещё текст |ABCDEF| ещё текст текст GHJKL снова |ABCDEF|GHJKL конец';

    или метка random2837465FgFF|

    $myString='Текст, ещё текст random2837465FgFF|ABCDEF| ещё текст текст GHJKL снова random2837465FgFF|ABCDEF|GHJKL конец';

    Да вероятность встретить в тексте random2837465FgFF|ABCDEF|GHJKL стремиться к 0, но технически она есть. Т.е. подход - в лоб, не научен.
  • Как лучше организовать замену текста в строке?

    logpol32
    @logpol32 Автор вопроса
    Почти то что надо.
    Но есть проблема, которую в вопросе я не достаточно четко описал (наверно моя вина).
    важна позиция текста

    Текст для замены и текст который не надо трогать может совпадать. Именно поэтому я и искал начало строки для замены и окончание строки - откуда изменять и до куда.

    Я тут вставил ещё одну строку после ABCDEF (копию).
    Её не надо заменять т.к. у неё другая позиция в тексте.

    $str = 'Текст, ещё текст ABCDEF ABCDEF ещё текст текст GHJKL -- много текста MNOP и напоследок снова ABCDEF BBB конец';

    Но она будет заменена (согласно шаблону и лимиту).
    Текст, ещё текст AAA CCC ещё текст текст BBB -- много текста MNOP и напоследок снова CCC BBB конец

    https://onlinephp.io/c/3ed5a
  • Правильно ли я понимаю смысл статических и не статических объектов (this self)?

    logpol32
    @logpol32 Автор вопроса
    Дмитрий,
    Вы можете запретить создавать экземпляры класса объявив __constructor как private

    Пока не видел такого. Обычно в конструкторе пишут код, который проверяет создан ли уже экземпляр класса (синглтон) и если создан не дают создать новый.
    Но было бы намного удобнее если класс можно было делать статическим (как во многих языках).

    https://www.google.ru/search?q=php+late+static+bin.

    Знаю про это. Но пока до конца не понимаю позднее статическое связывание.

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

    Так он и так будет с точки зрения (CIL/виртуальной машины/памяти и т.д.) статичен.

    Мы можем создать миллион экземпляров одного класса. И неизменная часть кода (например метод, не содержащий переменных) будет хранится в памяти в единственном экземпляре (что логично и оптимально).
    Иначе бы пришлось размножать в памяти одинаковый код (один и тот же метод миллион раз).
  • Avast запрещает гугл хром подключаться к стороннему сайту. Это вирус?

    logpol32
    @logpol32 Автор вопроса
    Согласен. Аваст часто блокирует обычные сайты.
    У меня регулярно блокировал банковские сайты. Проверял всё cureit ссылки и сайты касперским - всё чисто.
  • Как правильно задавать пространства имен?

    logpol32
    @logpol32 Автор вопроса
    Сергей delphinpro,
    но в реале файлы инклудятся только когда обращается к соответствующему классу.

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

    Если у вас на сайте 100500 классов, они не будут при каждом запросе все грузиься в память.
    Это понятно, оно нигде не грузится.
  • Как правильно задавать пространства имен?

    logpol32
    @logpol32 Автор вопроса
    Сергей delphinpro,
    Тут говорится, что неймспейс Junior\classes расположен в папке classes.
    Неймспейс вообще может быть любым.

    Вы имели ввиду, что мы можем написать его любым?
    Это понятно, что мы не обязаны ориентироваться на структуру каталогов.
    Но, для корректной работы, неймспейс в json и в указанной папке (php файлах в этой папке) должны совпадать.

    Ничего странного, и логики тут вашей нет.

    Спасибо, идею понял - но всё равно логика и архитектурное решение странное.
    Пишем кучу классов и инклудим всё в автолоад.
    Автолоад подключаем во все файлы (или в индекс).

    В десктопных языках подключаются только те классы, пространства, которые нужны.
    И тот же Visual Studio автоматически выделяет серым не используемые пространства имен и не включает их при сборке.

    И всё это даже не компилируется (там промежуточный язык и своя виртуальная машина), а вынесено в отдельный фреймворк (.NET). В результате приложение получается быстрым (ничего лишнего не загружается) и компактным (20-50 килобайт).

    До композера, в PHP, я просто инклудил что нужно, куда нужно.
    В PHP, как я понял, мы просто собираем всё в кучу чтобы не "заморачиваться" с инклудами - у нас заинклужено всё, осталось для доступа прописать неймспейс, который часто един для всех файлов в одной папке...
  • Как правильно задавать пространства имен?

    logpol32
    @logpol32 Автор вопроса
    Сергей delphinpro, спасибо, посмотрел - код работает.
    А что это значит? То что в php файлах, в папке classes обязательно присутствует namespace Junior\classes;?
    "Junior\\classes\\": "classes"

    А если (ну а вдруг) в папке classes1 (за которую отвечает другой разраб) будет namespace Vasya\classes1;
    то вручную прописывать в composer/json
    "Vasya\\classes1\\": "classes1"
    ?

    И странно, что в index.php нет неймспейса namespace Junior; (по логике должен же быть т.к. он корневой элемент нашего сайта)
  • Как правильно задавать пространства имен?

    logpol32
    @logpol32 Автор вопроса
    Про композер тоже не достаточно хорошо понимаю (гуглил, читал, смотрел ролики и т.д.).
    Зачем его везде используют?

    Я перехожу с десктопных языков - там всё подключается через пространства имен или автоматически или руками.
    И ничего страшного писать в С++ #include
    Или в c# using System;

    А вот код
    spl_autoload_register(function ($class_name) {
        include $class_name . '.php';
    });

    не достаточно потнятен. Что там подключают?
    И программист думает, ищет аргумент переданный в функцию и потом понимает, что было подключено.