代码之家  ›  专栏  ›  技术社区  ›  Geek

提取对应于记忆值的多行

  •  2
  • Geek  · 技术社区  · 9 年前

    情况是:-i有记忆元组,如{“Groupid(主键)”、“groupname”、“group type”、“creatorid”、“adminid”和“Member_list”}。

    成员列表=“memberone@xyz,membertwo@xyz,memberthree@xyz“。现在我要提取其中membertwo@xyz存在。如何在从mnesisa中选择时应用防护??任何指针

    现在,在经历了sherif给出的方法之后,出现了以下错误

         in function  checktable1:getRecords/1 (checktable1.erl, line 201)
    

    37>checktable1:getRecords(“a”)。 **异常错误:右侧值不匹配 {中止, {undef, 〔{字符串,标记,〔“a,b,c”,“,”〕,〔〕}, {checktable1,存在,2, 〔{file,“checktable1.erl”},{line,203}〕}, {checktable1,'-getRecords/1-fun-1-',7, 〔{file,“checktable1.erl”},{line,197}〕}, {qlc,collect,1,[{file,“qlc.erl”},{line,1330}]}, {qlc,eval,2,〔{file,“qlc.erl”},{line,296}〕}, {mnesia_tm,应用_乐趣,3, 〔{file,“mnesia_tm.erl”},{line,833}〕}, {mnesia_tm,执行事务,5, 〔{file,“mnesia_tm.erl”},{line,813}〕}, {checktable1,getRecords,1, 〔{file,“checktable1.erl”},{line,201}〕}〕}} 在函数checktable1:getRecords/1中(checktable1.erl,第201行)

    1 回复  |  直到 9 年前
        1
  •  1
  •   Sherif Eweis    9 年前

    你必须使用mnemosyne

    getRecords(ListMember)->  
        F = fun() ->
                Q = qlc:q(
                        [
                                Record
                                || Record <- mnesia:table(table_name_here),
                                   exists(Record#table_name_here.member_list, ListMember)
                        ]),
                qlc:e(Q)
        end,
        {atomic, L}=mnesia:transaction(F),
        L.
    

    然后需要实现函数exists(Member_list,Member),该函数扫描Member_list中的成员,如果找到则返回true,否则返回false。别忘了

    -include_lib("stdlib/include/qlc.hrl"). 
    

    这没有得到遵守,只是为了证明。我还可以建议您更改数据库设计,以避免扁平列表(字符串形式的列表),或任何与此相关的列表作为值。当然,如果可能的话,我不知道你在做什么。你至少应该能够把一个成员列表放在那里,而不是一个字符串。但这并不意味着你应该这样做。

    编辑:

    exists(ML, M)->lookUp(string:tokens(ML, ","), M).
    lookUp([], M)->false;
    lookUp([M|R], M)->true;
    lookUp([_|R], M)->lookUp(R,M).
    

    如果需要,还可以使用以下内容而不是exists(记录#table_name_here.member_list,ListMember)。

    lists:member(ListMember, string:tokens(Record#table_name_here.member_list, ","))