Перейти к содержанию
  • Регистрация
  • 0
AndreyS

SQLite Mac OS, Кодировка

Вопрос

Доброго всем дня! У меня в  самый неподходящий момент возникла следующая проблема:

 

Есть приложение для Win и Mac. Работает с SQLite (Через FDQuery).

Естественно, в базе куча данных с кириллицей. Так вот, на Win - все нормально, на одном Mac(10.10) - тоже все хорошо. Попробовал поставить на второй Mac(10.9.5) - b и вот там уже начались проблемы с кодировкой. Причем, читает из таблицы 

S := Query.FieldByName('Title').AsString; //Без проблем

а вот при записи в таблицу

Query.ParamByName('Title').AsString := 'Заголовок';

В таблицу записывается '????????' (Причем именно запись идет неправильно). При подключении к базе Указываю, что StringFormat=Unicode.

 

Может кто-то сталкивался с таким уже?

 

Есть подозрения, что на 10.9.5 какая-то старая dylib, которая неправильно работает с кириллицей. тогда, наверное, нужно подключать свою к приложению, но опять же, где ее взять и как подключить? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рекомендуемые сообщения

  • 0

Не работаю с FDQuery (использую компоненты от  devart), поэтому мой вопрос/ответ может быть не корректным. Я так понимаю вы используете внешнюю библиотеку для sqlite. Возьмите (найдите) ее в компе (что там вроде sqlite*.dylib) в котором все ок (мак) и киньте ее в другой. Вроде бы там можно использовать встроенный механизм доступа к SQlite? Если, да, по попробуйте его.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Незнаю как на делфи. Но на с++ такая:

Query->ParamByName('Title')->AsString = L"Заголовок";

Изменено пользователем Axbor

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Vitaldj, а с девартовскими компонентами никогда не возникало проблем с кодировкой?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Vitaldj, а с девартовскими компонентами никогда не возникало проблем с кодировкой?

Да как то не припомню)).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Там есть режим (я его использую), который позволяет напрямую соединиться, без библиотек (dll, dylib). И работает шифрование БД. И после его включения, вашу БД нельзя открыть ничем, кроме вашего приложения.

Изменено пользователем Vitaldj

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

 

Vitaldj, а с девартовскими компонентами никогда не возникало проблем с кодировкой?

Да как то не припомню)).

 

в деварте(и скорее всего везде) на мобилах AsString лучше забыть навсегда...только aswidestring, иначе крякозябры

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

В общем попробовал разные варианты:

1. Менял кодировку самой базы данных - не помогло.

2. Пробовал использовать девартоские компоненты - строки в кириллице ни читаются, ни пишутся.

3. Помогло только .AsWideString. Теперь вроде везде нормально читается и пишется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

В девартовских компонентах есть Data Type Mapping Rules. Их надо заполнять и никаких проблем нет)). Можно в рантайме, я люблю в дизайнтайме:

post-96-0-20489900-1453715328_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


  • Похожий контент

    • От Алиса Романец
      Доброго времени суток, форумчане!
      Есть программка, которая имеет свой конфиг. И если на винде, я могу спокойно складировать этот конфиг в папку C:\ProgramData, то с маком всё сложнее. Просто так записать конфиг и папку в /Library/Application Support/ не получится, требуются права администратора. Замучавшись с попытками сохранения конфига в эту папку, я решила пойти другим путём и заставила программу сохранять этот конфиг (вместе с последующими генерируемыми программой файлами) внутрь себя (MyProgramm.app/Contents/MacOS). Первое время всё работало нормально, файлы сохранялись, генерировались в саму программу. Но, как обычно бывает, что-то пошло не так и... В результате, сейчас я имею то, что программа при первом запуске из RAD генерирует первый конфиг в себя (MyProgramm.app/Contents/MacOS/Config.cfg), запускается при запуске из RAD. НО, стоит мне запустить её независимо от студии (в надеждах, что она считает конфиг внутри себя, как она делала раньше), как она просто падает. Добавив небольшое ShowMessage(FileExists('Config.cfg').ToString()); в качестве отладки, я узнаю, что она падает из-за того, что НЕ МОЖЕТ НАЙТИ ФАЙЛ КОНФИГА, ЧТО НАХОДИТСЯ В НЕЙ САМОЙ. Затем, методом тыка было обнаружено, где именно он пытается найти этот файл - в корне диска с системой. Вопрос к вам, как пофиксить это дерьмо? 
      Сразу скажу, код со вчерашнего дня вообще не менялся. Фрагмент работы с конфигом я приложила ниже.
      procedure TForm1.FormCreate(Sender: TObject); var PRGP, OUTP: String; i: Integer; begin {тут находится код для MSWINDOWS} {$IFDEF POSIX} AssignFile (CFG, 'AErenderConfiguration.cfg'); //Привязка файла, что по идее должен быть внутри софта if FileExists ('AErenderConfiguration.cfg') then //Тут ошибка вылезает, потому что он не может найти файл в корне диска begin //Чтение самого конфига Reset (CFG); Readln (CFG, LANG); Readln (CFG, PRGP); Readln (CFG, OUTP); Readln (CFG, AERPATH); Readln (CFG, DEFPRGPATH); Readln (CFG, DEFOUTPATH); projectPath.Text := PRGP; outputPath.Text := OUTP; Lang1.Lang := LANG; CloseFile (CFG); end else begin //Действия, если конфиг не существует. Тоже ошибка, потому что в macOS корень диска заблокирован для записи. Rewrite (CFG); for i := 1 to 6 do Writeln (CFG, ' '); LANG := 'EN'; Lang1.Lang := LANG; CloseFile (CFG); end; {$ENDIF POSIX} RAD Studio 10.3 Rio (26.0.32429.4364), PAServer 20.0, macOS 10.13.6 High Sierra (MacBook 13" Mid 2010). 
    • От x11
      function OnlyDec(const s: String): string; Var ch: char; i: integer; begin for i := 0 to s.Length do if CharInSet(s[i], ['0'..'9']) then result := result + s[i]; или for i := low(s) to High(s) do if CharInSet(s[i], ['0'..'9']) then result := result + s[i]; или for ch in s do if ch in ['0'..'9'] then result := result + ch; или for ch in s do if CharInSet(ch, ['0'..'9']) then result := result + ch; end; Почитал http://docwiki.embarcadero.com/RADStudio/Tokyo/en/String_Types_(Delphi) но до конца не понял.
      Как всё-таки более правильно сделать цикл по строке?
      Я склоняюсь к последнему варианту.
    • От x11
      При попытке подключиться к базе данных SQLite на эмуляторе с Android  7 получаю исключение:
      Delphi Tokyo + UniDAC 7.
      Эмулятор какой-то неполноценный?
    • От brunnengi
      Здравствуйте.
      Требуется программа на андроид с набором кнопок со следующем функционалом:
      1. Кнопка1 - создать базу в test.sqlite (в том месте где доступ к нему есть только у самого приложения (имею ввиду если это не ROOT телефон, при рут и так всё понятно)
      2. Кнопка2 - создать таблицу в базе test.sqlite с названием "TblTest01" (с разным набором полей на своё усмотрение)
      3. Кнопка3 - создать таблицу в базе test.sqlite с названием "TblTest02" (с разным набором полей на своё усмотрение)
      4. Кнопка4 - Добавить строку в таблицу "TblTest01" (любой набор данных на ваших усмотрение)
      5. Кнопка5 - Удалить строку в таблице "TblTest01" (по любому ключу на ваше усмотрение)
      6. Кнопка6 - Изменить строку в таблице "TblTest01" (по любому ключу и любое значение на ваше усмотрение)
       
      Приложение должно иметь фоновый сервис, который должен получать данные с сервера и добавлять их в базу test.sqlite в таблицу "TblTest02".
      При получение новый данных, сервис должен показать в "шторке" сообщение, по клику на которую открывается само приложение с визуальной частью.
      Т.е. если визуально приложение закрыто, выгружено, не запущено или запущено, фоновый процесс должен сам делать запросы к серверу и добавлять новые данные в базу, если они есть/поступили
      Приложение должно запускаться вместе с системой, после перезагрузки и т.д.
      Использовать только те компоненты что доступны в самой среде из коробки.
      Часть где делается запрос к серверу должен иметь timeout равный 20 секундам.
      Сервис должен грамотно делать запросы к серверу как положено в Андроид приложениях. 
      Серверная часть мне не нужна, можете для теста сами эмулирвать эти процессы.
       
       
      -----
      ЦЕНА: 2500р.
      СРОКИ: Не горит, но в целом где то дней 7 есть
      Перечисляю на QIWI, ЯД, Сбербанк, короче куда скажите.
    • От long_island
      Всем привет. Встал вопрос после обновления MacOS до High Sierra. Ранее для работы приложения через https из коробки работал Indy в RAD Studio 10.0. После обновления MacOS стала появляться ошибка о невозможности подгрузить библиотеку OpenSSL. Понял, что в обновленной MacOS теперь используется LibreSSL и из коробки теперь не работает. Перерыл тонну материала, но вопрос остался не решенным. Надеюсь, что кто - то имеет какие - то догадки в этом направлении.
    • От Wovan2
      Здравствуйте.
      Немного предыстории. Нужно соорудить клиент-сервер. Клиент на Android, сервер на Windows. 
      Собственно перебираю варианты. 
      1. Сделал с помощью DataSnap. Работает. Но очень громоздко и не понятно.
      2. Tethering. Так и не смог реализовать обмен данными между сервером и клиентом типа запрос-ответ.
      3. IdTCPClient, IdTCPSever. Раньше (D7) опыт работы отрицательный, но в FMX, видимо, альтернативы нет.
      Так что сейчас предварительно реализую простой диалог запрос-ответ. Причем все вроде работает. И кода немного и быстро. НО. Уперся в кодировку. На клиенте (Android) не получается прочитать кириллицу. Сначала пробовал общаться Read, Write и передавать просто строки. Пробовал всякие индийские компоненты для кодировки. Но без понимания ничего и не получилось. В интернете где-то наткнулся на предложение передавать потоками. Реализовал. Стало лучше, но проблема с кодировкой не пропала. Скажем так, эта проблема уменьшилась вдвое. На стороне сервера все ОК. На стороне клиента либо знаки "????", либо ромбики с вопросами, либо ошибка "No mapping for the unicode character exists in the target multi-byte code page". Это я бессистемно перебирал варианты кодировок. К сожалению до сих пор так и не понимаю эти перекодировки. Вернее не так. Не понимаю откуда и куда идут какие кодировки. 
      В общем помогите пожалуйста советом или кодом. Ниже код с которым экспериментирую. (код не большой)
      Сервер
      procedure TForm1.IdTCPServerExecute(AContext: TIdContext);
      var
       s : TStringStream;
      begin
       s := TStringStream.Create;
       mem.Lines.Add(AContext.Connection.Socket.Binding.PeerIP);
       AContext.Connection.IOHandler.ReadStream(s);
       s.Position := 0;
       mem.Lines.Add(Utf8ToAnsi(s.ReadString(s.Size)));
       s.Free;
       s := TStringStream.Create;
       s.WriteString('И тебе привет');//  And You, Hi с этим все нормально, проблема только с русскими буквами
       s.Position := 0;
       AContext.Connection.IOHandler.Write(s,s.Size,true); //здесь s.Size = 13. в 26 никак не получается превратить, может быть тут что-то?
       s.Free;
      end;
      Клиент
      procedure TfrmMainClient.btn1Click(Sender: TObject);
      var s:TStringStream;
      begin
       s := TStringStream.Create;
       try
       IdTCPClient.Connect;
       if IdTCPClient.Connected
        then mem.Lines.Add('Есть контакт с сервером ' + IdTCPClient.Socket.Binding.PeerIP);
       s.WriteString('Привет');
       s.Position := 0;
        IdTCPClient.IOHandler.Write(s, s.Size, true);//здесь заметил, что s.Size = 12, похоже на unicode
        s.Clear;
        IdTCPClient.IOHandler.ReadStream(s);
        s.Position := 0;
        Mem.Lines.Add(s.ReadString(s.Size)); //ошибка здесь
       finally
        IdTCPClient.Disconnect;
        if Assigned(s)
         then s.Free;
       end;
      end;
      Этот код приводит на клиента к ошибке  "No mapping for the unicode character exists in the target multi-byte code page". На сервере сообщение "Привет" видно нормально.
      Помогите, кто чем может.
      ЗЫ. Тему "Как Получить текст по TCP (Indy) в нужной кодировке?" смотрел. Но либо она не актуальна (инди уже изменился), либо я не смог правильно понять. По крайней мере пробовал использовать это в самом начале, когда пытался передавать строки напрямую. В указанном коде IIdTextEncoding не представляю куда и как вставить.
      зы2: Извините. Пишу на Delphi 10.2. Indy 10.6.2(в комплекте с Delphi). Windows 10. Android 4 и 5
    • От notricky
      Суть вопроса в заголовке.
      Есть ли какие-то настройки у базы или FireDAC чтобы в английской системе (винда 7) русский текст отображался не вопросами, а русским текстом?
      Настройки у БД UTF-8.
    • От Clio
      Добрый день !
      В приложении я использую базу SQLite (полt, содержащие дату и время тип REAL) . В TFDQuery я описал это поле - тип Float и через LiveBindings подключил к TGrid (Date Column). 
      Но в гриде отображается только год, а не полное время. 
      Подскажите, пожалуйста, как необходимо настроить поле в Query и TGrid, чтобы дата и время отображалась правильно.
    • От Евгений Корепов
      Обнаружил очередной глюк Tokyo - сломали Text в Android. А именно порушили раскраску символов Юникода.
      Воспроизводится просто :
      procedure TFormMain.FormCreate(Sender: TObject); Var Text1: TText; begin Text1:=TText.Create(Self); Text1.Text:='|' + Char($2713) + '|'; Text1.Font.Size:=48; Text1.Color:=TAlphaColorRec.Red; Text1.Align:=TAlignLayout.Client; Text1.TextSettings.HorzAlign:=TTextAlign.Center; Text1.TextSettings.VertAlign:=TTextAlign.Center; FormMain.AddObject(Text1); end; На первом скриншоте этот код выполнен в Berlin, все выглядит как задуманно. На втором скриншоте этот же код в Tokyo.


    • От gelo1
      Здравствуйте ребята. Моё имя Олег. Я из Минска.
      Подскажите пожалуйста. У меня есть приложение для OS Android представляющее собой базу данных в котором задеплоин файл БД SQLite. Хотелось бы пойти дальше и изучить как обновлять этот файл базы на этом приложении из удалённого сервера простора INTERNET. Может у кого есть готовое решение или ссылка где это подробно описано?
      Благодарю.
      С Уважением. Олег.
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...