Как получить несколько строк в mnesia

{atomic,[R]}={atomic,[{ios,2,"hhh"},{ios,1,"hhh"}]}

это приводит к ошибке. Что я пытаюсь сделать, так это в основном выбрать несколько строк из таблицы mnesia и использовать оператор case для обработки любой ошибки (если не существует записи, которую я ищу). Всякий раз, когда есть один или нулевой кортеж, соответствующий элемент, который искал, работает нормально, но когда есть более одного кортежа, он выдает ошибку. Ниже приведен полный код.

x( Artist) ->
Query = fun() ->
        mnesia:match_object({ios,'_', Artist } )
    end,
 X=case mnesia:transaction( Query) of
    {atomic,[R]} ->
io:format("Text found in Android : ~p~n", [R#ios.txt]) ;
    {atomic,[]} ->
        Id=1000, 
        io:format("No records with ID = ~p~n", [Id]);
   {aborted,{no_exists,ios}}->
          hi        
end,
X.

person Geek    schedule 13.02.2015    source источник


Ответы (1)


Если ваш запрос находит несколько строк, ответ будет (я думаю) {atomic,List}, где список — это список, который содержит более одного элемента и, следовательно, не может соответствовать [R], который представляет собой список из одного элемента.

Что вы можете сделать, так это получить список и просмотреть его, чтобы распечатать результаты;

x( Artist) ->
Query = fun() ->
        mnesia:match_object({ios,'_', Artist } )
    end,
 case mnesia:transaction( Query) of
    {atomic,[]} ->
        Id=1000, 
        io:format("No records with ID = ~p~n", [Id]);
    {atomic,L} ->
        [io:format("Text found in Android : ~p~n", [R#ios.txt]) || R <- L] ;
    {aborted,{no_exists,ios}}->
          hi        
end.
person Pascal    schedule 13.02.2015
comment
: Большое спасибо. Это сработало для меня. Еще один вопрос: нужно ли мне добавлять больше случаев ошибок (на текущий момент их 3 ({atomic, []}, {atomic, L}, {aborted, {no_exists, ios}})).если да, то какие это могут быть? - person Geek; 13.02.2015
comment
Если вы хотите быть более общим, вы можете сопоставить {aborted,_Reason}, и вы поймаете все возможные случаи ошибок (с точки зрения транзакции), см. документацию на [www.erlang.org/doc/man/mnesia.html #match_object-1] - person Pascal; 13.02.2015